說到枚舉,可能很多人都會想到枚舉類型,但在javascript對象中有一個屬性為可枚舉性,他是什么呢?
概念
可枚舉性(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
,所以一般的遍歷操作都無法獲取該屬性,使得它有點像“秘密”屬性,但還是可以直接獲取它的值。
至於for...in
循環和Object.keys
方法的區別,在於前者包括對象繼承自原型對象的
屬性,而后者只包括對象本身的
屬性。如果需要獲取對象自身的所有屬性,不管enumerable的值,可以使用Object.getOwnPropertyNames
方法