ES6之Generator(3)知识点总结(十)

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

猜你喜欢

转载自blog.csdn.net/lhjuejiang/article/details/79946350