遍历所有不可枚举属性的任意方法



在编写JavaScript时,我经常忘记内置对象的一些属性,不得不在mdn中查找它们,这很麻烦,因为它会减慢我的工作速度。

与其引用文档,不如创建一个对象并使用for ... in通过console.log()对其进行检查。但是,当涉及到不可枚举的属性时,即使for ... in也无济于事。

所以我的问题是,除了谷歌和文档之外,还有什么方法可以检查不可枚举的属性吗?

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.

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

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

我知道

这很旧,但是您可以使用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' ]

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

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...of
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Spread_syntax

最新更新