17-可迭代对象
可迭代(Iterable) 对象是数组的泛化。这个概念是说任何对象都可以被定制为可在 for..of
循环中使用的对象。
数组是可迭代的,但不仅限于数组,例如字符串也是可迭代的。
Symbol.iterator
假设我们有这样一个对象,它并不是数组,但是看上去很适合用 for...of...
:
js
let user = {
name: 'John',
sizes: {
width: 180,
height: 80,
},
school: undefined,
};
此时我们使用 for...of...
语法:
js
for (let item of user) {
console.log(user);
}
会报错:
这说明对象并不天生是可迭代的,为了让它可迭代,我们需要为对象添加一个名为 Symbol.iterator
的方法:
- 当
for...of
循环启动时,它会调用这个方法。这个方法必须返回一个迭代器——一个有next
方法的对象。 for...of
仅适用于这个被返回的对象。- 当
for...of
循环希望取得下一个数值,它就调用这个对象的next
方法。 next
方法返回的结果的格式必须是{done: Boolean, value: any}
,当done=true
时,表示循环结束,否则value
是下一个值。
js
user[Symbol.iterator] = function () {
// 获取对象的键值对
const entries = Object.entries(this);
let index = 0;
return {
// 实现 next 方法
next() {
if (index < entries.length) {
const [key, value] = entries[index++];
return { done: false, value: { key, value } };
} else {
return { done: true };
}
},
};
};
字符串是可迭代的
#todo