const person = {
name: "Lydia Hallie",
age: 21
}
[...person] // ["Lydia Hallie", 21]
对象默认并不是可迭代的。
如果迭代规则被定义,则一个对象是可迭代的(An iterable is an iterable if the iterator protocol is present)。
我们可以通过添加迭代器symbol [Symbol.iterator]
来定义迭代规则,其返回一个 generator 对象,比如说构建一个 generator 函数 *[Symbol.iterator]() {}
。
如果我们想要返回数组 ["Lydia Hallie", 21]
: yield* Object.values(this)
,这个 generator 函数一定要 yield 对象 person
的 values 。
另外,本题还需要注意的一个点:
- yield 关键字用来暂停和恢复一个生成器函数(function*)
- yield* 表达式用于委托给另一个 generator 或可迭代对象。
const person = {
name: "lzh",
age: 21,
};
// 方法一
person[Symbol.iterator] = function* () {
yield* Object.values(this);
};
// 方法二
person[Symbol.iterator] = function* () {
for (let x in this) {
yield this[x];
}
};
console.log([...person]); //['lzh', 21]