js--ES6对象之属性的可枚举性及遍历详解

可枚举性

对象的每个属性都有一个描述对象,用来控制该属性的行为,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()]]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值