JavaScriptES6对象之属性的可枚举性及遍历详解

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/c__dreamer/article/details/81606798

目录

 

可枚举性

属性的遍历


可枚举性

对象的每个属性都有一个描述对象,用来控制该属性的行为,Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象。描述对象的enumerable属性,称为可枚举性,如果为true,为可枚举的,如果为false,就表示某些操作会忽略当前属性。

let obj = { foo :1};
console.log(Object.getOwnPropertyDescriptor(obj,"foo"));

目前有四个操作会忽略enumerable为false的属性。

for...in循环

只遍历对象自身的和继承的可枚举的属性

Object.keys方法

返回对象自身的可枚举的属性的键名

JSON.stringify()

只串行对象自身的可枚举的属性。

Object.assign()

忽略enumerable为false的属性,只拷贝对象自身的可枚举的属性

这四个操作之中,前三个是ES5就有的,最后一个Object.assign是ES6新增的。其中,只有for...in会返回继承的属性,其他三个方法都会忽略继承的属性。只处理对象自身的属性。实际上,引入“可枚举”(enumerable)这个概念的最初的目的,就是让某些属性可以规避掉for...in操作,不然所有内部属性和方法都会遍历到。

比如:对象原型的toString方法,以及数组的length属性,就通过“可枚举性”,从而避免被for...in遍历到。

console.log(Object.getOwnPropertyDescriptor(Object.prototype,"toString").enumerable);       //false
console.log(Object.getOwnPropertyDescriptor([],"length").enumerable);       //false

另外,ES6规定所有Class的原型方法都是不可枚举的。

console.log(Object.getOwnPropertyDescriptor(class a{ foo(){}}.prototype,"foo").enumerable);    //false

属性的遍历

1.for...in

for...in循环遍历对象自身的和继承的可枚举属性(不含 Symbol 属性)。

2.Object.key(obj)

Object.keys返回一个数组,包括对象自身的(不含继承的)所有可枚举属性(不含 Symbol 属性)的键名。

3.Object.getOwnPropertyNames(obj)

Object.getOwnPropertyNames返回一个数组,包含对象自身的所有属性(不含 Symbol 属性,但是包括不可枚举属性)的键名。

4.Object.getOwnPropertySymbols(obj)

Object.getOwnPropertySymbols返回一个数组,包含对象自身的所有 Symbol 属性的键名。

5.Reflect.ownKeys(obj)

Reflect.ownKeys返回一个数组,包含对象自身的所有键名,不管键名是 Symbol 或字符串,也不管是否可枚举。

 以上的 5 种方法遍历对象的键名,都遵守同样的属性遍历的次序规则。
          首先遍历所有数值键,按照数值升序排列
          其次遍历所有字符串键,按照加入时间升序排列
          最后遍历所有Symbol键,按照加入时间升序排列
let queue = Reflect.ownKeys({ [Symbol()] : 0,b : 0, 10 : 0, 2 : 0 , a : 0,});
console.log(queue);         [2,10,b,a,[Symbol()]]

主页传送门

展开阅读全文

没有更多推荐了,返回首页