for...in由于历史遗留问题,它遍历的实际上是对象的属性名称。一个Array数组也是一个对象,数组中的每个元素的索引被视为属性名称,所以我们可以看到使用for...in循环Array数组时,拿到的其实是每个元素的索引。
let arr = ['a','b','c']; for(let index in arr ){ console.log(index); // 0 1 2 } for(var value of arr){ console.log(value); //a b c }
for of 补充了for in 的缺陷
let arr = ['a','b','c']; arr.hobby = 'foosball'; for(let index in arr){ console.log(`${arr[index]}`); // a b c 'foosball' } for(var value of arr){ console.log(value); // a b c }
使用for in会遍历数组和对象上所有的可枚举属性,包括原型上的属性。所以for in更适合遍历对象,不适合使用for in遍历数组。