Node.js中的for..in需要.hasOwnProperty()吗?

时间:2014-11-07 09:24:47

标签: node.js prototype javascript-objects

当我执行for..in时,如果我小心不要自己修改if (obj.hasOwnProperty(key)) {...},我是否可以免除Node {j}中的Object.prototype检查?

或者如果我require()某些第三方软件包碰巧会修改Object.prototype,那是否也会导致模块的Object.prototype搞砸了?

2 个答案:

答案 0 :(得分:1)

节点中没有任何特定内容可以保证不进行此项检查。如果您已经在使用lodash,则可以使用_.forOwn()https://lodash.com/docs#forOwn

另一种选择是:

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

或继续进行'if'检查,有几个选项,但我肯定会保留其中一张支票,你的选择。

答案 1 :(得分:1)

  

如果我很小心永远不会自己修改Object.prototype,我可以省去if(obj.hasOwnProperty(key)){...}中的Node.js吗?

不,因为Object是全局的。任何人在你使用的任何模块(或者他们通过代理使用的任何模块)中与它混淆,并且无论你做什么,他们都会为你的代码打破它。财产检查是损害控制。这是对某人的性质的检查,你隐含地继承了这个。

node_modules / breakit.js

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

运行节点..

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

重要的是,虽然 for 循环中需要.hasOwnProperty,但循环本身可能不是必需的,在大多数情况下可以更好地避免。 air-bnb eslint style guide for instance bans looping over an object all together