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