一个*号的区别吗?
The yield keyword is used to pause and resume a generator function.
The yield* expression is used to delegate to another generator or iterable object.
function* g1() {
yield 2
yield 3
}
function* g2() {
yield 1
yield g1()
yield* g1()
yield [4, 5]
yield* [6, 7]
}
const iterator = g2()
console.log(iterator.next()) // { value: 1, done: false }
console.log(iterator.next()) // { value: {}, done: false }
console.log(iterator.next()) // { value: 2, done: false }
console.log(iterator.next()) // { value: 3, done: false }
console.log(iterator.next()) // { value: [4, 5], done: false }
console.log(iterator.next()) // { value: 6, done: false }
console.log(iterator.next()) // { value: 7, done: false }
console.log(iterator.next()) // { value: undefined, done: true }
10 回答11k 阅读
6 回答2.9k 阅读
5 回答4.7k 阅读✓ 已解决
4 回答3k 阅读✓ 已解决
2 回答2.5k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
3 回答2.1k 阅读✓ 已解决
两者都是返回 iterator 的一个元素,不过
yield 的返回值是当作一个元素
yield* 的返回值是一个 iterator,会依次返回这个 iterator 中的每个元素
举例
「2021-01-24」补充
Generator 函数返回的是一个 Generator 对象,我们主要使用它的
next()
方法来判断是否有值,以及值是什么,它的返回值结构是:{ value, done }
。来看个示例:
输出
注意
yield
和return
都可以在next().value
中把值带出来,他们的区别在于yield
对应的next().done
是false
,而return
对应的next().done
是true
。对于之后(每种情况第 3 项),都再没有返回值,所以
value
都是undefined
,也都没有对应的yield
语句,所以done
是true
(可以这样理解,函数自然完成,相当于是在最后return
,而return
和return undefined
是等价的。for ... of
大概可以翻译成这样一个while
一旦
done
就跳出循环,所以return
产生的next().value
不会被循环体处理。(要不然,对于标准的,只有yield
的 generator,最后会在循环体里处理一个undefined
)