在實際開發(fā)中疚鲤,我們有時需要知道對象的所有屬性,js原生給我們提供了一個很好的方法:Object.keys吧彪,該方法返回一個數(shù)組,并且只能返回可以枚舉屬性和方法的名稱
Object.getOwnPropertyNames():它會返回可枚舉和不可枚舉的屬性和方法的名稱盾剩。
Object.keys():它只會返回可枚舉的屬性和方法的名稱。
但是都不能取到原型鏈上的屬性名稱碘裕。
for in可以取到原型鏈上的屬性名稱
這三個方法,都可以用來遍歷對象攒钳,這非常有用,其中后兩個都是es5中新增的方法雷滋。
本文會用到一些es5的對象知識不撑,如果你不了解,可以看一下開頭提到的文章晤斩,首先我們需要一個父對象焕檬。
var parent = Object.create(Object.prototype, {
a: {
value: 1,
writable: true,
enumerable: true,
configurable: true
}
});
parent繼承自O(shè)bject.prototype,有一個可枚舉的屬性a澳泵。下面我們在創(chuàng)建一個繼承自parent的對象child实愚。
var child = Object.create(parent, {
b: {
value: 2,
writable: true,
enumerable: true,
configurable: true
},
c: {
value: 3,
writable: true,
enumerable: false,
configurable: true
}
});
child有兩個屬性b和c,其中b為可枚舉屬性,c為不可枚舉屬性腊敲。
下面我們將用四種方法遍歷child對象击喂,來比較四種方法的不同。如下的代碼代表程序的輸出碰辅。
console.log('yanhaijing is God');
// > yanhaijing is God
注:⑤代表es5中新增的方法懂昂,你可能需要一款現(xiàn)代瀏覽器來訪問。
for in
for in是es3中就存在没宾,最早用來遍歷對象(集合)的方法凌彬。
for (var key in child) {
console.log(key);
}
// > b
// > a
從輸出可以看出,for in會輸出自身以及原型鏈上可枚舉的屬性循衰。
注意:不同的瀏覽器對for in屬性輸出的順序可能不同铲敛。
如果僅想輸出自身的屬性可以借助 hasOwnProperty』岫郏可以過濾掉原型鏈上的屬性伐蒋。
for (var key in child) {
if (child.hasOwnProperty(key)) {
console.log(key);
}
}
// > b
上面的代碼,僅輸出了child自己的可枚舉屬性b顽素,而沒有輸出原型parent中的屬性咽弦。
Object.keys⑤
Object.keys是es5中新增的方法,用來獲取對象自身可枚舉的屬性鍵胁出。
console.log(Object.keys(child));
// > ["b"]
可以看出Object.keys的效果和for in+hasOwnProperty的效果是一樣的型型。
Object.getOwnPropertyNames⑤
Object.getOwnPropertyNames也是es5中新增的方法,用來獲取對象自身的全部屬性名全蝶。
console.log(Object.getOwnPropertyNames(child));
// > ["b", "c"]
從輸出可以看出其和Object.keys的區(qū)別闹蒜。
總結(jié)
相信看完后,搞不清楚的同學(xué)應(yīng)該明白了抑淫,在es3中绷落,我們不能定義屬性的枚舉性,所以也不需要那么多方法始苇,有了keys和getOwnPropertyNames后基本就用不到for in了砌烁。