概念
可枚舉性(enumerable)用來控制所描述的屬性,是否將被包括在for...in循環之中。具體來說,如果一個屬性的enumerable爲false,下面三個操作不會取到該屬性。
* for..in循環
* Object.keys方法
* JSON.stringify方法
enumerable “隱身術”
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"]
JSON.stringify(o // => "{a:1,b:2,c:3}"
上面代碼中,d屬性的enumerable
爲false
,所以一般的遍歷操作都無法獲取該屬性,使得它有點像“祕密”屬性,但還是可以直接獲取它的值。
細節補充:
1.至於for...in
循環和Object.keys
方法的區別,在於前者包括對象繼承的
屬性,而後者只包括對象本身的
屬性。
2.如果需要獲取對象自身的所有屬性,不管enumerable的值,可以使用Object.getOwnPropertyNames
方法
3.自定義js對象屬性默認的enumerable爲true,除非用Object.defineProperty函數更改屬性特性的值
4.js封裝的基本類型對象的屬性的enumberable爲false,如Object,Number,Array等,具體比如一個js數組的length屬性就是不可枚舉的