ESLint报错: for…in loops iterate over the entire prototype chain, which is virtually never what you want.
原因
for…in会遍历整个原型链,可能会出现我们不想遍历到的属性,例如
class A {
constructor() {
this.a = 'va'
}
};
A.prototype.todo = () => 'todo';
let a = new A();
for(let k in a) { // for..in 遍历
console.log(k)
}
// a todo
console.log(Object.keys(a));
// [a]
解决
添加hasOwnProperty判断,或
改为使用Object.keys或Object.entries,这两个方法不会遍历原型链上的属性
class A {
constructor() {
this.a = 'va'
}
};
A.prototype.todo = () => 'todo';
let a = new A();
for(let k in a)
if(a.hasOwnProperty(k))
console.log(k) // a
Object.keys(a).forEach((k) => console.log(k)); // a
Object.entries(a).forEach((e) => console.log(e)); // ['a', 'va']
备注: hasOwnProperty可以兼容到ES3,Object.keys和Object.entries分别是ES6及ES8中引入的,但是经过Babel打包后,这个区别可以忽略不计
本文介绍了ESLint在for...in循环中报错的原因,即可能遍历到原型链上的属性。提供了通过hasOwnProperty检查和使用Object.keys/Object.entries替代的传统方法,以确保代码只遍历预期的对象自身属性。
1983





