【问题标题】:Is .hasOwnProperty() necessary with for..in in Node.js?Node.js 中的 for..in 是否需要 .hasOwnProperty()?
【发布时间】:2015-01-04 01:15:36
【问题描述】:

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

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

【问题讨论】:

  • 任何第三方库都可能在 Object.prototype 上添加额外的属性或方法。你永远不应该假设这永远不会发生。所以我会说最好让你的“如果”。对象对所有模块都是通用的。在你的 javascript 代码的不同部分有不同类型的“对象”会很奇怪。

标签: node.js prototype javascript-objects


【解决方案1】:

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

另一种选择是:

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

或者继续做'if'检查,有几个选项,但我肯定会保留其中一个检查,你的选择。

【讨论】:

    【解决方案2】:

    如果我很小心从不自己修改 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
    

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

    【讨论】:

      猜你喜欢
      • 2012-09-25
      • 2012-07-04
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 2018-04-16
      • 2017-05-23
      相关资源
      最近更新 更多