因此,当我使用 for..in 循环遍历对象键时,我的 IDE 不喜欢。我收到警告:
可能对意外(自定义/继承)成员进行迭代,可能缺少 hasOwnProperty 检查
所以我明白了它在说什么,所以在这种情况下,使用类似的东西for (const key of Object.keys(obj))
而不是for (const key in obj)
?
在性能方面,两者之间有什么真正的区别吗?
因此,当我使用 for..in 循环遍历对象键时,我的 IDE 不喜欢。我收到警告:
可能对意外(自定义/继承)成员进行迭代,可能缺少 hasOwnProperty 检查
所以我明白了它在说什么,所以在这种情况下,使用类似的东西for (const key of Object.keys(obj))
而不是for (const key in obj)
?
在性能方面,两者之间有什么真正的区别吗?
Object.keys
循环数组和使用语句循环之间存在细微差别for...in
,在大多数情况下不会注意到这一点。Object.keys(obj)
只返回一个具有对象自身属性的数组,同时for...in
返回在原型链中找到的键,以便后者对原型进行额外检查,obj
然后再检查原型的原型等等以此类推,直到整个原型链都被访问过。这无疑使第二种方法的效率低于第一种方法,但正如我已经提到的,在大多数情况下几乎不会注意到这种差异。
对于更正式的方法,如MDN中所述:
Object.keys() 方法返回给定对象自己的可枚举属性的数组,其顺序与 for...in 循环提供的顺序相同(不同之处在于 for-in 循环将原型链中的属性枚举为出色地)。
您仍然可以使用for(var key in obj){}
. 似乎期望Object.hasOwnProperty
在for..in
循环内
这是因为for..in
即使密钥在原型链中,也会在原型链中查找并返回 true。
而只有在 key 是它的属性Object.hasOwnProperty
时才会返回 true 。owns
你可以这样做
for(var key in obj){
if(obj.hasOwnProperty(key)){
// rest of code}
}