for...of
循环是在ES6中引入的,它专门用于遍历可迭代对象的元素,如数组、字符串、Map、Set 等这些实现了迭代器接口的数据结构。所谓的可迭代对象就是那些具有 Symbol.iterator
属性的对象。
例如,数组是可迭代对象,可以使用 for...of
遍历其元素:
javascriptlet array = [10, 20, 30]; for (let value of array) { console.log(value); } // 输出: // 10 // 20 // 30
然而,普通对象不是可迭代的,没有实现 Symbol.iterator
方法,因此不能直接使用 for...of
遍历它的属性。尝试使用 for...of
直接遍历一个对象会导致一个错误:
javascriptlet obj = {a: 1, b: 2, c: 3}; for (let value of obj) { console.log(value); } // TypeError: obj is not iterable
另一方面,for...in
循环是用来遍历一个对象的所有可枚举属性的键,包括继承的可枚举属性。它不仅可以遍历普通对象的属性,还可以遍历数组(虽然通常不推荐这样做,因为它会返回数组索引,而且可能会遍历到原型链上的属性)。
使用 for...in
遍历对象的例子:
javascriptlet obj = {a: 1, b: 2, c: 3}; for (let key in obj) { console.log(key + ': ' + obj[key]); } // 输出: // a: 1 // b: 2 // c: 3
总结一下,for...of
用于遍历可迭代对象的元素,而 for...in
用于遍历对象的所有可枚举属性的键。因此,for...of
不能直接遍历普通对象,而 for...in
可以。