从枚举属性谈JS对象的遍历

2017-05-23  本文已影响164人  KedAyA

最近查资料的时候发现了一些有趣的事情,主要是从Object.create这个函数中发现了一些知识漏洞,于是想梳理一下。

创建对象的简单方法大概有以下几种

function Person() {
  this.x = 5;
}
let a1 = {x: 5};
let a2 = new Person();
let a3 = Object.create({x: 5});
let a4 = Object.create({}, {
  x: 5
});

以上四种方法创建的对象均可以使用a.x访问到该对象的x属性,但其中还是有一些差别的。

以上示例的对象不仅具有原理上的不同,在遍历中也有不同的表现。对对象的遍历我们可以想到使用for in 循环。for in循环的原理则是遍历对象及其原型链上所有的可枚举属性。

function iterator(x) {
  for(let i in x) {
    console.log(i);
  }
}
iterator(a1) // 输出x
iterator(a2) // 输出x
iterator(a3) // 输出x
iterator(a4) // 输出undefined

我们发现了a4方式创建的对象与其它3种方法在使用for in方法遍历时的不同,可以看到他的属性描述符都被置为false。

Object.getOwnPropertyDescriptor(a2,"x") // 输出 Object {value: 5, writable: false, enumerable: false, configurable: false}
上一篇下一篇

猜你喜欢

热点阅读