3

在编写 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.
4

2 回答 2

4

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

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

于 2012-06-03T17:13:50.553 回答
0

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

如果for...of你实现了一个可迭代的对象,你可以在迭代器的帮助下使用 a (因为对象是不可迭代的)

假设您有以下具有一个可枚举属性和不可枚举属性的对象

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);
}

或使用扩展运算符(因为扩展使用迭代 via Symbol.iterator

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

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

于 2020-05-13T01:31:17.950 回答