记笔记,主要是为了提高学习效率,避免只看不动手,领略不到书的精髓,忽略到书中的重点知识,本文学习主要是根据阮一峰大神走的,很感谢阮一峰大神的无私奉献。如果想要了解更详细的关于本节的内容可以看阮一峰大神的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命令一起用,会报错。