Javascript;这种“hasOwnProperty”的使用是多余的吗? [复制]

Posted

技术标签:

【中文标题】Javascript;这种“hasOwnProperty”的使用是多余的吗? [复制]【英文标题】:Javascript; is this use of "hasOwnProperty" redundant? [duplicate] 【发布时间】:2018-12-19 21:25:55 【问题描述】:

查看我们的一些应用代码,我发现以下内容:

for (prop in aBunchOfData.properties) 
  if (!aBunchOfData.properties.hasOwnProperty(prop)) continue;
  doABunchOfProcessing(aBunchOfData.properties[prop]);

据我了解,for ... in 只会循环遍历对象的“自己”属性。 hasOwnProperty 在这里检查可以产生影响吗?如果是,在什么条件下?

谢谢!

【问题讨论】:

现在更常用Object.entriesObject.values 见***.com/questions/12735778/for-in-and-hasownproperty 【参考方案1】:

没有。 in 运算符会提升原型链,而 .hasOwnProperty() 不会。使用 if 语句可确保仅包含对象本身的属性。为避免必须使用检查,您可以使用Object.keys(),它不会提升原型链。

【讨论】:

详细说明,in 迭代所有 可枚举 键,Object.keys() 迭代所有 自己的可枚举 键。两者都不会迭代不可枚举的键,尽管.hasOwnProperty() 会为自己的不可枚举的键返回true 谢谢帕特里克,你提到的可枚举性澄清了它!我在查看所有这些答案时认为“我已经在没有 hasOwnProperty 的情况下迭代了 Object 实例一百万次,而我从未见过 toStringvalueOf 等弹出窗口” @GershomMaes 更进一步,如果你有Symbol 键,它们也不是可枚举的,这提供了一个最小层的安全。 【参考方案2】:

这很有用,因为for in 循环将检查所有对象属性,包括原型道具。这是低效的,因此检查hasOwnProperty 会将循环限制为该对象独有的属性。循环的首选方式是:

Object.keys(myObject).forEach(()=> // do stuff)

map 也可以在这里用作迭代器。

【讨论】:

map 可以用作迭代器吗?我觉得那行不通,因为Object.keys() 创建 一个数组,尽管我可能错了。 如果您指的是变异的内容,那么这个故事还有更多内容,是的。但是您绝对可以映射由Object.keys() 产生的数组。

以上是关于Javascript;这种“hasOwnProperty”的使用是多余的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

hasOwnProperty具有多个属性

js04---object1

$$hashKey 用于 angular2 中的对象?

为啥 JavaScript 会错误地进行这种比较? [关闭]

为啥这种 javascript 注入攻击不起作用? [复制]

构建一个 JavaScript 库,为啥要以这种方式使用 IIFE?