yield 和 yield*
yield
yield 关键字用来暂停和恢复一个生成器函数(function*
)
举例:
function* gen(index) {while (index < 2) {yield index++;}
}const iterator = gen(0);console.log(iterator.next().value);
console.log(iterator.next().value);
console.log(iterator.next().value);
// 0
// 1
// undefined
语法:
[rv] = yield [expression];
- expression:从生成器函数中返回的值。如果省略,则返回
undefined
。 - rv:检索传递给生成器的
next()
方法的可选值,以恢复其执行。
yield
关键字使 生成器函数 暂停执行,yield
关键字后面的表达式的值 返回给生成器的调用者。可以理解成是一个基于生成器的版本的return关键字。(It can be thought of as a generator-based version of the return keyword.)
yield只能从直接包含它的生成器函数中调用。不能从嵌套函数或回调中调用它。
yield关键字会导致对生成器的next()
方法的调用,这个方法会返回具有两个属性value
和done
的IteratorResult对象。value
属性是对yield
后面跟的表达式求值的结果,当done
值为false
时,表示生成器函数尚未完全完成。
一旦遇到 yield 表达式,生成器的代码执行就会暂停,直到生成器的 next()
方法再次被调用。每次调用生成器的next()
方法时,生成器都会恢复执行,直到遇到以下情况:
- yield,遇到yield导致生成器再次暂停执行并返回生成器的新值。 下一次调用
next()
方法时,在yield
之后紧接着的语句将继续执行。 - **throw **,用于从生成器中抛出异常。它完全停止了生成器的执行。当异常抛出时,通常情况下,在调用者中恢复执行。
- 生成器函数迭代完毕,在这种情况下,生成器执行结束,并且IteratorResult给调用者返回
value
属性的值是undefined
,done
属性为true
。 - 遇到
return
语句。在这种情况下,生成器执行结束,并将IteratorResult返回给调用者,其value
属性的值是return
语句后面表达式的值的,done
属性 为true
。
如果给生成器中的next()
方法传递参数,则该值将成为生成器当前yield
操作返回的值。
在整个生成器代码运行中,yield
操作符,以及向Generator.prototype.next()
方法中传递一个参数指定起始值,生成器提供了强大的控制作用。。。
举例:
下面的代码声明了一个 生成器函数:
function* countName(){let name = ['happy','chen','666'];for (let i = 0; i < name.length; i++) {yield name[i];}
}
一旦生成器函数已定义,可以通过构造一个迭代器来使用它:
function* countName(){let name = ['happy','chen','666'];for (let i = 0; i < name.length; i++) {yield name[i];}
}let nameIterator = countName();
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
console.log(nameIterator.next());
// { value: 'happy', done: false }
// { value: 'chen', done: false }
// { value: '666', done: false }
// { value: undefined, done: true }
yield*
yield* 表达式用于委托给另一个generator 或可迭代对象。
语法:
yield* [[expression]];
- expression:返回一个可迭代对象的表达式。
yield*
表达式迭代操作数,并产生它返回的每个值。yield*
表达式本身的值是当迭代器关闭时返回的值(即done为true时)。
举例:
委托给其他生成器
以下代码中,g1() yield 出去的每个值都会在 g2() 的 next()
方法中返回,就像那些 yield 语句是写在 g2() 里一样。(values yielded by g1() are returned from next()
calls just like those which are yielded by g2().)
function* g1() {yield 2;yield 3;yield 4;
}function* g2() {yield 1;yield* g1();yield 5;
}let iterator = g2();console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// { value: 4, done: false }
// { value: 5, done: false }
// { value: undefined, done: true }
委托给其他可迭代对象
除了生成器对象这一种可迭代对象,yield* 还可以 yield 其它任意的可迭代对象,比如说数组、字符串、arguments 对象等等。(Besides generator objects, yield* can also yield other kinds of iterables, e.g. arrays, strings or arguments objects.)
function* g3() {yield* ['happy', 'chen'];yield* 'is';yield* Array.from(arguments);
}let iterator = g3('a', 'Front-end', 'development', 'engineer');
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
// { value: 'happy', done: false }
// { value: 'chen', done: false }
// { value: 'i', done: false }
// { value: 's', done: false }
// { value: 'a', done: false }
// { value: 'Front-end', done: false }
// { value: 'development', done: false }
// { value: 'engineer', done: false }
// { value: undefined, done: true }
yield* 表达式的值
yield 是一个表达式*,不是语句,所以它会有自己的值。
function* g4(){yield* [5,2,0];return '可达鸭';
}let result;function* g5(){result = yield* g4();
}let iterator = g5();console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());
console.log(iterator.next());console.log(result);
// { value: 5, done: false }
// { value: 2, done: false }
// { value: 0, done: false }
// { value: undefined, done: true }// 可达鸭
yield 和 yield*相关推荐
- Python中yield和yield from的用法
yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...
- python yield from yield_python yield和yield from用法总结详解
python yield和yield from用法总结...
#!/usr/bin/env python # -*- coding: utf-8 -*-from inspect import isgeneratorfunction def fab(max): n ...
- python yield from_简述 yield 和 yield from
yield 函数可以看成是一堆指令的集合.在函数中加入yield可以把一个函数变成一个generator,虽然调用的方式不一样了,但是其实现的功能和原来的函数基本是一样的. 而yield在这其中的作用 ...
- python协程--yield和yield from
字典为动词"to yield"给出了两个释义:产出和让步.对于 Python 生成器中的 yield 来说,这两个含义都成立.yield item 这行代码会产出一个值,提供给 n ...
- 从yield 到yield from再到python协程
yield 关键字 def fib():a, b = 0, 1while 1:yield ba, b = b, a+b yield 是在:PEP 255 -- Simple Generators 这个 ...
- 从yield到yield from
yield 带有 yield 的函数不再是一个普通函数,而是一个生成器generator 把生成器当作管道 def add_A(seq):for item in seq:yield item + '- ...
- yield 跟 yield * 的区别
yield表达式的值,是下一个iter.next的参数值 yield*表达式的值,是yield*后的iterable在done为true时的value值. yield * 的使用: function* ...
- js中的yield、yield*和Generator函数
基本概念 yield和yield*都是js中的关键字,他们不能直接使用:只能配合Generator进行使用:Generator是一种函数,声明方式和普通函数类似,只不过要在function后面加个*( ...
- python进阶:yield与yield from
目录 yield与生成器 send close throw yield from yield与生成器 前面我们介绍过生成器:迭代器.可迭代对象.生成器的区别和联系 使用了 yield 的函数被称为生成 ...
最新文章
- android 监听物理返回键,Android应用开发之react-native 监听Android物理返回键
- php javabean对象,Struts2 bean标签:创建并示例化一个JavaBean对象
- boost::hof::implicit用法的测试程序
- 小程序跨行跨列多列复杂表格实现
- ubantu java编辑器_Linux Ubuntu中最好的代码编辑器 程序员都这么看吗?
- 关于ssh的一篇很好的文章
- vector, list, deque的使用区别
- 作用域闭包,你真的懂了吗?
- 需要友元的原因及使用
- mysql复制以及一主多从等常见集群概述
- 关于linux目录~ / .
- Filezilla client站点出现中文乱码的解决办法
- 苹果电脑修改MAC地址方法
- 图解联合概率密度、边缘概率密度、条件概率密度之间的关系
- 计算机有很多的优点英语,电脑的优点和缺点英文作文
- uni-app微信小程序跳转公众号;微信小程序打开公众号;微信小程序识别二维码添加好友;微信小程序通过公众号添加好友;小程序里识别企业微信二维码点击联系人名片无反应?
- 微型计算机芯片上的位数,微处理器芯片的位数指的是什么
- 小红书购物笔记在哪里看?
- 硬盘开盘数据恢复成功,笔记本硬盘开机无法识别到硬盘
- 云运维 linux centos7.2 LAMP环境搭建 一键全解析