我正在尝试编写一个可以接受列表或生成器作为输入的函数。例如这个函数:
function x(l) {
for (let i of l) {
console.log(i);
}
for (let i of l) {
console.log(i);
}
}
如果我像这样运行它:
x([1,2,3])
它将显示:
1
2
3
1
2
3
现在我想使用生成器作为输入:
function *y() {
yield 5
yield 6
yield 7
}
这些不起作用:
x(y())
x(y)
输出是:
5
6
7
undefined
我需要做什么才能让它发挥作用?
就Java而言,函数y
上面是一个发电机 and y()
is an Iterator. [1,2,3]
是一个列表,在 Java 中,列表是生成器。但是 javascript for 循环需要一个iterator,这意味着它无法重新启动。这似乎是 JavaScript 中的一个缺陷,因为 for 循环适用于迭代器而不是生成器。
发电机一台不能多次使用 https://stackoverflow.com/a/23848531/1048572。如果要迭代两次,则需要通过调用生成器函数两次来创建两个生成器。
当你的函数需要一个可迭代对象(在 a 中使用)时你可以做什么for … of
循环)是从生成器函数中动态创建一个:
x({[Symbol.iterator]: y})
如果你想写你的函数x
这样它就可以采用迭代器或生成器函数,您可以使用类似的东西
getIterator(val) {
if (typeof val == "function") // see also https://stackoverflow.com/q/16754956/1048572
return val();
if (typeof val[Symbol.iterator] == "function")
return val[Symbol.iterator]();
throw new TypeError("not iterable!")
}
function x(l) {
for (let i of getIterator(l)) {
console.log(i);
}
for (let i of getIterator(l)) { // call getIterator again
console.log(i);
}
}
x(y);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)