Iterator
iterator迭代器是满足迭代器协议的对象。
迭代器协议是:对象的next方法是一个无参函数,它返回一个对象,该对象拥有done和value两个属性。
Iterable
iterable可迭代对象是满足可迭代协议的对象。
可迭代协议:对象的[Symbol.iterator]值是一个无参函数,该函数返回一个迭代器。
在ES6中,map,set,array,arguments,string都是可迭代对象。可迭代对象可以有以下好处(用法):
- 使用for..of
- 使用扩展运算符
- 在yield*中使用
- 解构赋值
Generator
既是迭代器又是可迭代对象
yield*
生成器委托,可以委托给其他可迭代对象,调用它们的next(), 得到value。
并且yield*不是一个statement,而是一个expression。它有自己的值。
function* g4() {
yield* [1, 2, 3];
return "foo";
}
var result;
function* g5() {
result = yield* g4();
}
var iterator = g5();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true },
// 此时 g4() 返回了 { value: "foo", done: true }
console.log(result);
for (var a of iterator) {
console.log(a);// 1, 2, 3 分别输出
console.log(result);// undefined (还未执行完,没有到返回值的地方)
}
console.log(result); // foo
Reference:
[MDN Operators yield](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/yield)