当我执行for..in
时,如果我小心不要自己修改if (obj.hasOwnProperty(key)) {...}
,我是否可以免除Node {j}中的Object.prototype
检查?
或者如果我require()
某些第三方软件包碰巧会修改Object.prototype
,那是否也会导致模块的Object.prototype
搞砸了?
答案 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是全局的。任何人在你使用的任何模块(或者他们通过代理使用的任何模块)中与它混淆,并且无论你做什么,他们都会为你的代码打破它。财产检查是损害控制。这是对某人的性质的检查,你隐含地继承了这个。
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。