有什么方法可以遍历所有不可枚举的属性?

时间:2012-06-03 17:04:45

标签: javascript

编写JavaScript时,我经常会忘记内置对象的一些属性,并且必须在mdn中查找它们,这非常麻烦,因为它会减慢我的工作。

创建对象并使用for ... in使用console.log()进行检查更方便,而不是引用文档。但是当谈到不可枚举的属性时,即使for ... in也无济于事。

所以我的问题是,除了google和文档之外,有没有办法检查不可枚举的属性?

for(var i in Object){
    console.log([i,Object[i]]);
    // ["wtbind", function()]
}
console.log(Object.hasOwnProperty('create'));
// true
// Here Object.create is a non–enumerable property,
// and I have to look it up in documents if I forget it.

2 个答案:

答案 0 :(得分:3)

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames

似乎很有用,虽然这是一个相当新的补充,显然在Opera中不起作用。虽然它只列出自己的属性,但您总是可以爬上原型链。

答案 1 :(得分:0)

我知道这很旧,但是您可以为ES6使用新功能,我认为ES2018可以使用此功能:

您可以在迭代器的帮助下使用for...of如果实现了可迭代的对象(因为对象不可迭代)

比方说,您有一个具有一个可枚举属性且具有不可枚举属性的以下对象

const obj = Object.defineProperties({}, {
  enumerableKey: {
    enumerable: true,
    value: 'hello'
  },
  nonEnumerableKey: {
    enumerable: false,
    value: 'world'
  }
});

您可以使用Symbol.iterator使其迭代并定义自己的实现。在下面的示例中,我产生了每个键的值(但是您可以产生想要的任何值)

obj[Symbol.iterator] = function* () {
  for(const key of Object.getOwnPropertyNames(this)) {
    yield this[key]
  }
}

此后,您可以使用for...of循环遍历它:

// This will log:
// 'hello'
// 'world'
for(const val of obj) {
  console.log(val);
}

或使用传播算子(因为传播使用通过Symbol.iterator进行的迭代)

[...obj] //[ 'hello', 'world' ]

您想了解更多有关它的信息,建议您阅读以下内容: