在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性决定了这个属性能否被for…in查找遍历到。
常用的关于枚举的方法
for…in 遍历自身的和原型上继承的可枚举属性
Object.keys 遍历自身可枚举属性
JSON.stringify的使用 字符串化自身可枚举属性
设置一个属性不可枚举
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,所以一般的遍历操作都无法获取该属性,使得它有点像“秘密”属性,但还是可以直接获取它的值。
如果需要获取对象自身的所有属性,不管enumerable的值,可以使用Object.getOwnPropertyNames方法
obj.propertyIsEnumerable(“属性名”)可以判断属性是否可枚举
console.log(o.propertyIsEnumerable('a')); //true
console.log(o.propertyIsEnumerable('b'));//true
console.log(o.propertyIsEnumerable('d'));//false