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.entries
或Object.values
见***.com/questions/12735778/for-in-and-hasownproperty
【参考方案1】:
没有。 in
运算符会提升原型链,而 .hasOwnProperty()
不会。使用 if
语句可确保仅包含对象本身的属性。为避免必须使用检查,您可以使用Object.keys()
,它不会提升原型链。
【讨论】:
详细说明,in
迭代所有 可枚举 键,Object.keys()
迭代所有 自己的可枚举 键。两者都不会迭代不可枚举的键,尽管.hasOwnProperty()
会为自己的不可枚举的键返回true
。
谢谢帕特里克,你提到的可枚举性澄清了它!我在查看所有这些答案时认为“我已经在没有 hasOwnProperty
的情况下迭代了 Object
实例一百万次,而我从未见过 toString
、valueOf
等弹出窗口”
@GershomMaes 更进一步,如果你有Symbol
键,它们也不是可枚举的,这提供了一个最小层的安全。
【参考方案2】:
这很有用,因为for in
循环将检查所有对象属性,包括原型道具。这是低效的,因此检查hasOwnProperty
会将循环限制为该对象独有的属性。循环的首选方式是:
Object.keys(myObject).forEach(()=> // do stuff)
map
也可以在这里用作迭代器。
【讨论】:
map
可以用作迭代器吗?我觉得那行不通,因为Object.keys()
创建 一个数组,尽管我可能错了。
如果您指的是变异的内容,那么这个故事还有更多内容,是的。但是您绝对可以映射由Object.keys()
产生的数组。以上是关于Javascript;这种“hasOwnProperty”的使用是多余的吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
为啥 JavaScript 会错误地进行这种比较? [关闭]