可迭代对象
可迭代对象是可以在 for...of 循环中使用的对象。
可迭代的内建对象:
StringArraySetMapargumentsTypedArrayNodeList
可以将任何对象通过添加 [Symbol.iterator] 方法变为可迭代对象。
Symbol.iterator
for...of 循环遍历可迭代对象的关键在于对象的 Symbol.iterator 方法。
for...of循环启动时,调用对象的Symbol.iterator方法,返回一个迭代器 (iterator)。- 迭代器是指拥有
next()方法的对象。 - 可选的
return()方法在迭代提前退出前调用 (break或出错)。
- 迭代器是指拥有
for...of调用迭代器的next()方法获取下一个值。next()返回的格式为{ done: Boolean, value: any },done: true表示循环结束
js
let range = {
from: 1,
to: 5,
[Symbol.iterator]() {
return {
current: this.from,
last: this.to,
next() {
if (this.current <= this.last) {
return { done: false, value: this.current++ };
} else {
return { done: true };
}
},
};
},
};
for (let num of range) {
console.log(num); // 1, 2, 3, 4, 5
}可迭代对象就是实现了 Symbol.iterator 方法的对象。
用途
for...of- 扩展
... - 解构
{ xxx } = obj[xxx] = arr yield*
可迭代对象 v.s. 类数组对象
两者没有必然联系,前者是迭代器模式的实现,后者是对数组的模拟,有 length 属性但是缺少相应的原型方法。
- 可迭代对象 (Iterable):
- 实现了
Symbol.iterator方法
- 实现了
- 类数组对象 (Array-like):
- 有索引和
length属性
- 有索引和
Array.from() 把可迭代对象或类数组对象转换为数组。