我有一个带有一些键和值的对象。
我最初有这个循环:
for(const key in commands) {
if (commands.hasOwnProperty(key)) {
const value = commands[key];
// Do something else
}
}
那给了我下面的错误提示:
for..in循环遍历整个原型链,而这实际上从来都不是您想要的。使用Object。{keys,values,entries},然后遍历结果数组。 (无限制语法)
所以我将其更改为:
Object.keys(commands).forEach(key => {
if (commands.hasOwnProperty(key)) {
const value = commands[key];
}
});
现在,由于hasOwnProperty
,我收到以下错误消息:
请勿从目标对象访问Object.prototype方法'hasOwnProperty'。 (无原型内置)
如何编写一个简单的循环遍历键,同时避免出现错误错误?
答案 0 :(得分:3)
使用Object.keys
时,不需要检查hasOwnProperty
。 Object.keys产生一个专有属性数组。这就是为什么第一个eslint错误建议您使用它的原因。
对于第二个皮棉错误,建议您
Object.prototype.hasOwnProperty.call(commands, key)
存在该规则的原因是,如果使用commands.hasOwnProperty
创建了命令,则undefined
可能是Object.create(null)
。不过,就您而言,您只需要删除支票即可:
Object.keys(commands).forEach(key => {
const value = commands[key];
// Do something else
});
答案 1 :(得分:0)
Object.keys()
仅收集对象自己的属性。无需进行hasOwnProperty
检查。删除它可以解决第二个片段的问题。
如果您知道自己在做什么/仍然偏爱for-in
,则始终可以在导致错误的行之前添加//eslint-disable-next-line
行,以单独禁用该行的拖延警告。
答案 2 :(得分:0)
首先,如果不需要,可以禁用eslint规则。如其声明,for...in
将遍历继承的属性,因此通常与hasOwnProperty
结合使用,但是新的Object.keys
语法较短。
第二,如果您使用的是hasOwnProperty
,则不需要Object.keys
。它只会迭代自己的属性。
第三,eslint不喜欢您在对象上使用hasOwnProperty
,因为可以将其重新分配为其他函数。我想它确实希望您使用Object.prototype.hasOwnProperty.call(object, key)
,但是我认为很多情况下您都知道使用较短的版本是安全的。同样,如果您知道其中的含义,则可以禁用该规则。