为什么JavaScript中的迭代器不起作用?

3

当我运行以下Javascript脚本时

ite=Iterator(["aaa","bbb"])
ite.next()

我总是收到以下错误信息。

enter image description here

但这是我创建后第一个next(),为什么迭代器停止工作?此外,在JavaScript中创建对象时为什么可以省略 "new" 关键字?我在MongoDB v2.2.4客户端使用JavaScript。

5
你在哪个库中找到这个“Iterator”?这不是标准的 JavaScript。 - Denys Séguret
3
@dystroy:错误的。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Iterators_and_Generators - SLaks
1
@SLaks:有点不对。它不是标准的。https://dev59.com/vGfWa4cB1Zd3GeqPiZMx - voithos
2
@user2384994:明确一点,当大多数人提到“JavaScript”时,技术细节放在一边,他们指的是在大多数现代浏览器中存在的相当标准化的子集。V8 JavaScript引擎没有Iterator - voithos
1
这可能是一个 bug,但我不认为是。我看到文档明确通过引用传递参数,如果你也这样做会怎么样? - Sammaye
显示剩余8条评论
1个回答

3
基本上,你所学的Iterator并不存在于所有JavaScript引擎中——或者更确切地说,在所有ECMAScript引擎中(JavaScript在技术上是ECMAScript的Mozilla变体)。
这里有MDN文档,因为(惊喜!)MDN通常涵盖Firefox中使用的JavaScript版本。
另一方面,MongoDB的当前版本使用V8 JavaScript引擎(与Chrome中相同),因此它没有Iterator
不幸的是,这并不能解释你为什么没有得到ReferenceError。你使用的MongoDB版本很可能包含了一个具有可用Iterator的引擎。
在Firebug中测试这种行为时,我得到了更奇怪的结果。
>>> ite = Iterator(['aaa','bbb']);
>>> ite.next();
// Nothing
>>>
>>> var ite = Iterator(['aaa','bbb']);
>>> ite.next();
[0, "aaa"]
>>> ite.next();
[1, "bbb"]
>>> ite.next():
// Nothing

我怀疑Firebug可能会压制StopIteration,但我不知道为什么将迭代器设为全局变量会导致无法进行迭代。如果有人对此有任何见解,我很想听听。
同时,您可以尝试将迭代器创建为局部变量,因为这是我唯一能够使迭代工作的方法。
// Notice the 'var'
var ite = Iterator(["aaa","bbb"]);

是的,正如评论中所指出的那样,当REPL试图显示Iterator时,实际上会将其耗尽。这就解释了为什么 ite = Iterator(...) 不起作用(因为它将迭代器作为表达式的结果返回,然后被REPL耗尽),以及为什么 var ite = Iterator(...) 起作用(因为var声明的结果是undefined)。


它在最新版本中默认使用了V8,之前它使用的是spidermonkey。 - Sammaye
2
那么为什么调用Iterator(...)不会抛出ReferenceError呢?它不仅成功了,而且对next()的调用随后抛出了StopIteration,这是迭代API的一部分。 - cHao
@user2384994 这个答案并不能解决你的问题,你正在使用spidermonkey,这个应该可以工作。 - Sammaye
2
我的猜测是,当迭代器这样创建 ite = Iterator(...) 时,REPL 尝试显示其值,因此耗尽了它。当你使用 var ite = ... 时,REPL 得到的结果是 void,因此不会对迭代器执行任何操作。 - Mike Samuel
啊,是的,如果你没有明确声明它...这是一个常见的问题,通常会被忽视,干得好 :) - Sammaye
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接