1.什么是枚举
- 可枚举可以理解为是否可以被遍历被列举出来,可枚举性决定了这个属性能否被for…in查找遍历到。
- js中基本包装类型的原型属性是不可枚举的(不可被 for…in… 遍历),比如:
Boolean,Number和String三个的原型属性,或是 Boolean,Number值,都是不可枚举的,即是基本类型,也是引用类型。基本包装类型还可以像引用类型一样访问它自带的一些方法,但是不能像引用类型那样自定义方法。
2.判断属性是否可枚举的方法
2.2 for…in…
var num = new Number();
for(var pro in num) {
console.log("num." + pro + " = " + num[pro]);
}
无法打印,number中的属性无法被枚举,所以 for…in…不起作用
注意:
- 并不是所有的属性都会在for-in循环中显示。数组的 length 属性和 constructor 属性就不会被显示。
2.1 Object.propertyIsEnumerable()
- propertyIsEnumerable( ) 方法返回一个布尔值,表示属性是否可以枚举
- 每个对象都有一个propertyIsEnumerable方法。该方法可以确定对象中的指定属性是否可以通过for…in循环枚举,但通过原型链继承的属性除外。如果对象不具有指定的属性,则此方法返回false。
语法
- obj.propertyIsEnumerable(prop),prop:表示要测试的属性名称
- 返回值:Boolean类型
//例一:
var obj = {}
obj.propertyIsEnumerable('a') //false
//例二:
var obj = {a:1}
obj.propertyIsEnumerable('a') //true
- 简单来说,用户定义的属性都是可枚举的,而内置对象不可枚举。
- 一种情况除外:当属性是继承于其它对象原型时,这时用户定义的属性就是不可枚举的