for-in循環應該用在非數組對象的遍歷上,使用for-in進行循環也被稱爲「枚舉」。javascript
對於數組 ,迭代出來的是數組元素 但不推薦,由於不能保證順序,並且若是在Array的原型上添加了屬性,這個屬性也會被遍歷出來,因此
最好數組使用正常的for循環,對象使用for-in循環
對於對象 ,迭代出來的是對象的屬性;java
var obj = {
"key1":"value1",
"key2":"value2",
"key3":"value3"
};
function EnumaKey(){
for(var key in obj ){
alert(key);
}
}
function EnumaVal(){
for(var key in obj ){
alert(obj[key]);
}
}數組
javascript中in關鍵字還有下面的做用
定義:this
in操做符用來判斷某個屬性屬於某個對象,能夠是對象的直接屬性,也能夠是經過prototype繼承的屬性。
var Fn = function () { this.age = 1; };
Fn.prototype.name = 'jim';
// Fn.prototype.age = undefined;
var f = new Fn();
// hasOwnProperty
// 如何判斷屬性是被繼承的???
console.log( 'age' in f && !f.hasOwnProperty( 'age' ) );
// age 可能存在原型鏈上, 也可能不存在
// 若是屬性值就是 null 或 undefined, 那麼此時 f.age 就沒法判斷了spa
對於通常的對象屬性須要用字符串指定屬性的名稱prototype
如:
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar // returns true
"model" in mycar // returns true對象
若是你使用delete操做符刪除了一個屬性,再次用in檢查時,會返回false,如:繼承
var mycar = {make: "Honda", model: "Accord", year: 1998};
delete mycar.make;
"make" in mycar; // returns false
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
delete trees[3];
3 in trees; // returns false
若是你把一個屬性值設爲undefined,可是沒有使用delete操做符,使用in檢查,會返回true.ip
var mycar = {make: "Honda", model: "Accord", year: 1998};
mycar.make = undefined;
"make" in mycar; // returns true原型鏈
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");trees[3] = undefined;3 in trees; // returns true