for..in 和for..of 的区别

for...offor...in 都是用于循环遍历的结构,但它们有明显的区别,主要体现在遍历的对象以及它们遍历的内容(是值还是键/索引)上。下面是它们的详细区别:

1. for...in

for...in 用于遍历对象的可枚举属性,也可以用于遍历数组的索引

特点:

  • 遍历的是对象的键(属性名)或数组的索引

  • 适用于对象遍历,但不建议用于数组遍历,因为它会遍历所有可枚举的属性,包括继承的属性。

  • 返回的是属性名索引,而不是值。

示例:遍历对象

javascript复制代码let obj = { name: "Alice", age: 25, job: "developer" };
for (let key in obj) {
    console.log(key); // 输出对象的键: name, age, job
}

示例:遍历数组(不推荐)

javascript复制代码let arr = [10, 20, 30];
for (let index in arr) {
    console.log(index); // 输出: 0, 1, 2 (数组的索引)
    console.log(arr[index]); // 输出: 10, 20, 30 (对应的值)
}

注意: for...in 遍历的是索引而不是值,且可能会遍历数组中继承的属性,因此不推荐用于数组遍历。

2. for...of

for...of 是 ES6 引入的一种遍历方式,用于遍历可迭代对象,例如数组、字符串、MapSet 等。它会直接返回每个元素的值,而不是索引或属性名。

特点:

  • 遍历的是可迭代对象的值

  • 适用于遍历数组、字符串、MapSet 等可迭代对象。

  • 不适合遍历对象,因为普通对象不是可迭代的。

  • 返回的是数组或迭代对象的,不是索引。

示例:遍历数组

示例:遍历字符串

示例:遍历 Map

3. 关键区别总结

特性

for...in

for...of

遍历内容

对象的键(属性名)或数组的索引

可迭代对象的值(数组、字符串、Map 等)

适用对象

对象、数组(不推荐遍历数组)

数组、字符串、Map、Set 等可迭代对象

返回值

键名或索引

元素值

对象遍历

可以遍历对象的可枚举属性

不适用

数组遍历

遍历索引,不建议用于数组

遍历数组值,适合数组遍历

继承属性

可能会遍历继承属性(不建议用于数组)

不会遍历继承属性

4. 使用建议

  • for...in:适合遍历对象的键(属性名),但不推荐用于数组,因为它遍历的是索引,并且可能会遍历数组的继承属性。

  • for...of:适合遍历数组、字符串、MapSet 等可迭代对象,返回的是元素的值,更加直观和简洁。

因此,在大多数情况下,如果要遍历数组或可迭代对象,for...of 是更好的选择,而 for...in 主要用于遍历对象的属性。

Last updated