记笔记,主要是为了提高学习效率,避免只看不动手,领略不到书的精髓,忽略到书中的重点知识,本文学习主要是根据阮一峰大神走的,很感谢阮一峰大神的无私奉献。如果想要了解更详细的关于本节的内容可以看阮一峰大神的ES6官网http://es6.ruanyifeng.com/#docs/generator
yield*表达式
如果在Generator函数内部调用另一个Generator函数,默认情况是没有效果的。这个就需要用到yield*表达式,用来在一个Generator函数里面执行另一个Generator函数。
var g = function *(){
yield "leo";
yield "lalalal";
}
var p = g();
var g2 = function * (){
yield "donna";
yield* p;
yield "henory";
}
var p2 = g2();
console.log(p2.next());//{ value: "donna", done: false }
console.log(p2.next());//{ value: "leo", done: false }
console.log(p2.next());//{ value: "lalalal", done: false }
console.log(p2.next());//{ value: "henory", done: false }
console.log(p2.next());//{ value: "undefined", done: true }
注意:如果yield表达式后面跟的的是一个遍历器对象,需要在yield表达式后面加上星号,表明它返回的是一个遍历器对象,这被称为yield*表达式。
yield*表达式后面的Generator函数(没有return语句时),等同于在Generator函数内部,部署一个for...of循环。
如果yield*表达式后面的Generator函数有return语句时,需要用var value = yield* iterator 的形式获取return语句的值
var g = function *(){
yield "leo";
yield "lalalal";
return "over";
}
var p = g();
var g2 = function * (){
yield "donna";
var value = yield*p;
// console.log(value);
yield "henory";
}
var p2 = g2();
console.log(p2.next());
console.log(p2.next());
console.log(p2.next());
console.log(p2.next());
console.log(p2.next());
//{ value: "donna", done: false }
//{ value: "leo", done: false }
//{ value: "lalalal", done: false }
// over
//{ value: "henory", done: false }
//{ value: "undefined", done: true }
如果yield*后面跟着一个数组,由于数组原生支持遍历器,因此就会遍历数组成员,如果yield表达式后面跟一个数组,返回的是整个数组
var g2 = function * (){
yield "donna";
yield* ["leo","momo"];
yield [1,2,3];
yield "henory";
}
var p2 = g2();
console.log(p2.next());//{ value: "donna", done: false }
console.log(p2.next());//{ value: "leo", done: false }
console.log(p2.next());//{ value: "momo", done: false }
console.log(p2.next());//{ value: [1,2,3], done: false }
console.log(p2.next());//{ value: "henory", done: false }
实际上,任何数据结构只要有Iterator接口,就可以被yield*遍历。(数组、类数组、字符串、Map数据结构、Set数据结构)
如果一个对象的属性是Generator函数,可以在这个属性的前面加星号,表示这个属性是一个Generator函数
Generator函数不能跟new命令一起用,会报错。