可枚举属性问题

906 阅读3分钟
(找个地方保存一下看过的知识点,不是我写的)

枚举是指对象中的属性是否可以遍历出来,再简单点说就是属性是否可以以列举出来。

 一、怎么判断属性是否可枚举

       在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方法只对对象自身的属性(对象自身添加的、构造函数实例化的)有效,对原型上的、继承来的属性都 无效。

四、总结