在Node.js中使用for..in循环时,是否需要使用.hasOwnProperty()方法?

4
当我使用for..in循环时,如果我小心地不修改Object.prototype,在Node.js中是否可以省略if(obj.hasOwnProperty(key)){...}检查呢? 或者,如果我require()一些第三方包,它恰好修改了Object.prototype,那么这是否会破坏我的模块中的Object.prototype

任何第三方库都可能在Object.prototype上添加额外的属性或方法。你永远不应该假设这永远不会发生。因此,我建议最好让你的“if”语句来判断。Object是所有模块共用的。在JavaScript代码的不同部分拥有不同类型的“Object”将非常奇怪。 - George Lica
2个回答

1

在Node中没有任何特定的原因不进行此检查。如果您已经使用了Lodash,可以使用_.forOwn()https://lodash.com/docs#forOwn

另一个选项是:

Object.getOwnPropertyNames(yourObj)
.forEach(function(keyName) {
  yourObj[keyName] // do stuff
});

或者继续进行“if”检查,有几个选项,但我肯定会保留其中一个检查,你可以选择哪个。


1

如果我小心不修改Object.prototype,那么在Node.js中是否可以省略 if (obj.hasOwnProperty(key)) {...} 检查?

不行,因为Object是全局的。任何一个模块对它进行修改(或者它们使用的任何代理模块),都会破坏你的代码。属性检查是损害控制。它是对那些搞乱你从隐式继承中继承的东西本性的检查。

node_modules/breakit.js

Object.prototype.foobar = () => "borked";
module.exports = true;

运行 Node..

> require('breakit');
true
> let a = {};
> for ( let k in a ) { console.log(k) }
foobar
> a.foobar();
borked

虽然.hasOwnProperty对于for .. in循环是必要的,但在大多数情况下,循环本身可能并不必要,最好避免使用。例如,air-bnb eslint style guide禁止完全循环对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接