为什么使用 for...in 遍历数组是个坏主意?
你好!我最近开始学习 JavaScript,注意到遍历对象属性时经常使用 `for...in`。我想既然数组也是对象,那也可以用这个循环来遍历它。我写了这样的代码:
```javascript
const numbers = [10, 20, 30, 40];
for (let index in numbers) {
console.log(numbers[index]);
}
```
看起来一切正常——输出了 10, 20, 30, 40。但我注意到很多有经验的开发者批评这种做法,说这是“坏习惯”。为什么?代码明明能运行!使用 `for...in` 遍历数组可能会有什么问题?应该用什么替代它?请用例子解释一下,让我彻底明白。提前谢谢!
<<>>
为什么 for...in 不适用于数组
循环 for...in 是为遍历对象的可枚举属性而设计的,包括通过原型继承的属性。JavaScript 中的数组也是一个对象,但它的元素存储为数字索引。使用 for...in 时,不仅会遍历数组的索引,还会遍历任何添加到数组原型上的可枚举属性(例如通过 Array.prototype 添加的方法或属性)。这可能导致意外的行为,比如输出额外的值或顺序不可靠。此外,for...in 不保证按数字顺序迭代,而数组通常需要按顺序访问元素。更好的替代方案是使用 for...of(用于遍历值)或传统的 for 循环(用于遍历索引)。例如:
const numbers = [10, 20, 30, 40];
// 使用 for...of 遍历值
for (let num of numbers) {
console.log(num); // 输出 10, 20, 30, 40
}
// 使用 forEach 方法
numbers.forEach((num, index) => {
console.log(num); // 输出 10, 20, 30, 40
});
这些方法更安全、更可预测,避免了 for...in 的潜在问题。