for..in 或 for..of 对象键

for..in or for..of Object keys

所以我的 IDE 不喜欢我使用 for..in 循环迭代对象键。我收到警告:

Possible iteration over unexpected (custom / inherited) members, probably missing hasOwnProperty check

所以我明白它在说什么,所以在那种情况下使用 for (const key of Object.keys(obj)) 之类的东西而不是 for (const key in obj) 会更好吗?

两者在性能方面有什么真正的区别吗?

通过 Object.keys 数组循环和使用 for...in 语句循环之间存在细微差别,在大多数情况下不会被注意到。 Object.keys(obj) returns 只是一个具有对象自身属性的数组,而 for...in returns 也是在原型链中找到的键,为了后者做额外的检查到 obj 的原型是需要的,然后是原型的原型等等,直到访问了整个原型链。这肯定会使第二种方法比第一种方法效率低,但正如我已经提到的,在大多数情况下几乎不会注意到这种差异。

对于更正式的方法,如 MDN 中所述:

The Object.keys() method returns an array of a given object's own enumerable properties, in the same order as that provided by a for...in loop (the difference being that a for-in loop enumerates properties in the prototype chain as well).

您仍然可以使用 for(var key in obj){}。似乎期望 Object.hasOwnPropertyfor..in 循环

这是因为 for..in 也会在原型链中查找并且即使密钥在原型链中也会 return 为真。

Object.hasOwnProperty 只有 return 为真,如果键是它的 owns 属性。

你可以这样做

for(var key in obj){
 if(obj.hasOwnProperty(key)){
  // rest of code}
}