在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性决定了这个属性可否被for…in查找遍历到。函数
1、怎么判断属性是否可枚举性能
js中基本包装类型的原型属性是不可枚举的,如Object, Array, Number等,若是你写出这样的代码遍历其中的属性:this
var num = new Number(); for(var pro in num) { console.log("num." + pro + " = " + num[pro]); }
它的输出结果会是空。这是由于Number中内置的属性是不可枚举的,因此不能被for…in访问到。spa
Object对象的 propertyIsEnumerable() 方法能够判断此对象是否包含某个属性,而且这个属性是否可枚举。prototype
须要注意的是:若是判断的属性存在于Object对象的原型内,无论它是否可枚举都会返回false。code
2、枚举性的做用对象
属性的枚举性会影响如下三个函数的结果:blog
for…inip
Object.keys()get
JSON.stringify()
先看一个例子,按以下方法建立zx对象:
function Person() { this.name = "ZX"; } Person.prototype = { constructor: Person, job: "student", }; var ZX = new Person(); Object.defineProperty(zx, "sex", { value: "female", enumerable: false });
其中用defineProperty为对象定义了一个名为”sex”的不可枚举属性
接下来作如下验证:
for(var pro in ZX) { console.log("ZX." + pro + " = " + ZX[pro]); }
遍历结果:
能够看到除了”sex“以外的属性都遍历到了
2.
console.log(Object.keys(kxy));
结果:
只包含”name”属性,说明该方法只能返回对象自己具备的可枚举属性。
3.
console.log(JSON.stringify(kxy));
结果:
此方法也只能读取对象自己的可枚举属性,并序列化为JSON对象。