枚举是指对象中的属性是否可以遍历出来,再简单点说就是属性是否可以以列举出来。
一、怎么判断属性是否可枚举
在JavaScript中,对象的属性分为可枚举和不可枚举之分,它们是由属性的enumerable值决定的。可枚举性决定了这个属性能否被for…in查找遍历到。
js中的基本包装类型的原型属性是不可枚举的,比如Object,Array,Number等
这是一个例子:
它的输出结果是空的,因为Number中的内置属性是不可枚举的,所以不能被 for ... in 访问到 每个对象都有propertyIsEnumerable()方法,这个方法可以判断出指定的属性是否可枚举。 用法: obj.propertyIsEnumerable("属性名");
从中也可以发现,如果是对象的原型链中的属性,不管是否枚举都会返回false。
但是 for ...in 仍然可以读出原型链中的可枚举属性
二、枚举属性的作用
枚举属性主要会影响几个方法
ES5中: for...in //只遍历对象自身的和继承的可枚举的属性 Object.keys() //返回对象自身的所有可枚举的属性的键名 JSON.stringify //JSON.stringify() 方法用于将 JavaScript 值转换为 JSON 字符串。 ES6中:
Object.assign() //会忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性。
可以看出来这些都是可以遍历对象的方法,而这四个操作中只有for...in中会返回继承的属性 先看一个例子,创建一个"xsy"对象:
这里用defineProperty方法定义了一个叫"sex"的不可枚举属性
然后可以开始验证了:
a. for...in
输出的结果如下,可以发现 对象中声明的属性,原型链上绑定的属性成功输出了,而不可枚举属性“sex”没有输出。
三、设置可枚举属性
从上面可以看出:
1.Object.defineProperty(obj, prop, descriptor)方法有三那个参数
第一个:目标对象
第二个:目标属性,字符串
第三个:对目标属性的行为,放在对象里
2.enumerable为true时表示可枚举,enumerable为false表示不可枚举;
3.开发者自己定义的对象person中的所有属性默认都是可枚举的
如何判断是否可枚举-- propertyIsEnumerable
这说明了开发者自定义的属性在一般情况下时可以枚举的,但是内置的对象Math和基本包装类型里的属性是不可枚举的,
如Object, Array, Number等
其实,propertyIsEnumerable方法只对对象自身的属性(对象自身添加的、构造函数实例化的)有效,对原型上的、继承来的属性都 无效。