Skip to content

一、for in 遍历会遇到的问题

  • 问题:下面代码为什么只有自己定义的c被遍历出来,Object其他的属性却没有被遍历出来?
js
  var obj = {
    a: 1,
    b: 2
  }
  Object.prototype.c = function () {
      console.log('c')
  }
  for (var key in obj) {
      console.log(key); // a b c
  }

题解:

  • 解释这个现象,首先得了解下属性描述符。
  • 属性描述符:任何一个对象,它的任何一个属性,都会对应一个属性描述符,可以用这么一段代码来得到某一个属性的描述符 Object.getOwnPropertyDescriptor('对象', '属性'),返回描述符对象
js
    Object.getOwnPropertyDescriptor(Object.prototype, 'c');

返回结果:

text
{
  value: [Function (anonymous)],
  writable: true,   // 可以被修改
  enumerable: true, // 可以被遍历
  configurable: true
}
  • 根据上面的打印结果,查看toString方法有什么不同

返回结果:

text
{
  value: [Function: toString],
  writable: true,
  enumerable: false, // 不可以被遍历
  configurable: true
}

结论:当enumerable属性为false这个对象属性不能被遍历。

  • 改造上面的代码,使之属性c,不可遍历
js
Object.defineProperty(Object.prototype, 'c', {
    value: function () {
        console.log('c')
    },
    writable: true,
    enumerable: false, // 不可以被遍历
    configurable: true
})

Released under the MIT License.