【问题标题】:hasOwnProperty when iterating over dictionary [duplicate]遍历字典时的hasOwnProperty [重复]
【发布时间】:2017-01-07 15:18:41
【问题描述】:

我对 javascript 很陌生,我正在尝试迭代字典键/值。 (是的,我在这里阅读了一些帖子,但没有找到答案。)

这是我的字典:

showhidedict = {
    0: ["a"],
    1: [],
    2: ["a", "b"],
    3: []
};

这是我的迭代:

for (var value in showhidedict)
    $("#" + showhidedict[value]).hide();

resharper 建议我将hasOwnProperty-check 添加到循环中:

if (showhidedict.hasOwnProperty(value))

但是为什么呢?

hasOwnProperty-check 检查对象是否具有属性(这里是字典是否包含键),对吗? 但我真的需要支票吗?由于我遍历了键,我知道所有键都必须存在。还有其他点为什么我应该添加支票?

【问题讨论】:

  • 对象从其他对象继承属性,即obj["foo"] 可以返回一个值(并且"foo" in obj 将为真),即使obj.hasOwnProperty("foo") 为假。
  • Resharper 所做的是建议您确保您的数据结构有效。所以,当你从对象中取出一些元素时,你并没有抛出。
  • 您的hasOwnProperty 支票形式错误。应该是if (Object.prototype.hasOwnProperty.call(showhidedict, value));否则,如果showhidedict 中的数据属性之一被称为hasOwnProperty,代码将崩溃。
  • @melpomene 好的,但这就是 resharper 的建议
  • hasOwnProperty 的 MDN 文档也很有帮助。

标签: javascript resharper


【解决方案1】:

通常建议始终使用 hasOwnProperty,因为它指示对象是否具有对象本身的指定属性,并避免在其原型链中查找。

通常,您永远不应该假设代码运行的环境或您的对象何时由不同的库创建,或者原型是否已扩展,因此 hasOwnProperty 使您的代码“更安全”。

更多关于prototype chain的信息。

参考Object.prototype.hasOwnProperty()

【讨论】:

  • 请在投反对票时添加评论,以便我改进我的答案。
  • 您应该包含更多关于用例的详细信息,因为如果他们问这个问题,他们可能不熟悉扩展原型。您的回答对已经理解这个概念的人来说是有意义的,但对教不熟悉的人没有帮助。
  • @4castle 感谢您的评论,是的好主意,我已经提供了一些资源来指出 js 原型是如何工作的。为您的建议 +1。
  • 现在我明白了。我想时间会到来,当我爱上 JS 的时候。现在,我讨厌它:D
  • @MatthiasBurger 我很高兴我的回答能帮到你。每当您需要对 JS 进行澄清时,SO 社区随时准备提供帮助:)
【解决方案2】:

如果您使用in 关键字进行迭代,您正在迭代对象属性,返回的键是字符串,而不是数字。在这种迭代属性的上下文中,谨慎的做法是始终检查您只是在迭代该对象自己的属性,而不是原型链中的任何垃圾。

对于 Arraylike 的迭代,推荐的迭代可能仍然使用具有递增索引的常规 for 循环。该索引将是一个数字,它将依赖于 Arraylikes 的长度属性。它不需要检查 hasOwnProperty。

话虽如此,我不认为你写的代码是错误的,但尤其是在团队环境或使用外部 API 时,使用上述两种方法之一可能是谨慎的。 Resharper 就是要谨慎处理您的代码。

【讨论】:

  • 所以如果我使用外部对象(另一个 API,不是我的),我应该使用它吗?
  • @MatthiasBurger 绝对是,如果您的对象是由另一个 API 创建的,那么您不应该做出任何假设,并按照 resharper 的建议使用 hasOwnProperty 使您的代码更安全。我为您提供了一个链接,其中包含一些关于我的答案的其他资源,希望您能发现它们有用。如果您有任何问题,请告诉我们。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-10-26
  • 2021-08-07
  • 1970-01-01
  • 2021-05-25
  • 2021-06-05
  • 2015-10-25
  • 1970-01-01
  • 2019-06-04
相关资源
最近更新 更多