說(shuō)到枚舉,可能很多人都會(huì)想到枚舉類型,但在javascript對(duì)象中有一個(gè)屬性為可枚舉性,他是什么呢?
概念
可枚舉性(enumerable)用來(lái)控制所描述的屬性,是否將被包括在for...in循環(huán)之中。具體來(lái)說(shuō),如果一個(gè)屬性的enumerable為false,下面三個(gè)操作不會(huì)取到該屬性。
- for..in循環(huán)
- Object.keys方法
- JSON.stringify方法
enumerable “隱身術(shù)”
var o = {a:1, b:2};
o.c = 3;
Object.defineProperty(o, 'd', {
value: 4,
enumerable: false
});
o.d
// 4
for( var key in o ) console.log( o[key] );
// 1
// 2
// 3
Object.keys(o) // ["a", "b", "c"]
Object.getOwnPropertyNames(0)
JSON.stringify(o) // "{a:1,b:2,c:3}"
上面代碼中,d屬性的enumerable為false,所以一般的遍歷操作都無(wú)法獲取該屬性,使得它有點(diǎn)像“秘密”屬性,但還是可以直接獲取它的值。
至于for...in循環(huán)和Object.keys方法的區(qū)別,在于前者包括對(duì)象繼承自原型對(duì)象的屬性,而后者只包括對(duì)象本身的屬性。
如果需要獲取對(duì)象自身的所有屬性,不管enumerable的值,可以使用Object.getOwnPropertyNames方法