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

时间:2013-05-23 16:43:26

标签: javascript mongodb

当我运行以下Javascript脚本

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

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

http://i39.tinypic.com/9gd8w8.png

但它是我创建它之后的第一个next(),为什么迭代器停止工作?另外,为什么我们在Javascript中创建对象时可以省略“new”?我在MongoDB v2.2.4客户端中使用Javascript。

1 个答案:

答案 0 :(得分:3)

基本上,您所了解的Iterator在所有JavaScript引擎中都不存在 - 或者更准确地说,在所有ECMAScript引擎中都存在(JavaScript在技术上是ECMAScript的Mozilla变体)。

documentation on MDN因为(惊喜!)MDN通常涵盖Firefox中使用的JavaScript版本。

另一方面,当前版本的MongoDB使用V8 JavaScript engine(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,但我不知道为什么将迭代器设为全局导致它不能迭代。如果有人对此有任何见解,我会有兴趣听到它。

与此同时,您可能想尝试将Iterator创建为局部变量,因为这是我能够使迭代工作的唯一方法。

// Notice the 'var'
var ite = Iterator(["aaa","bbb"]);

是的,正如@MikeSamuel在评论中指出的那样,当REPL尝试显示迭代器时,它实际上会将其运行到耗尽状态。这可以解释为什么ite = Iterator(...)不起作用(因为它返回迭代器作为表达式的结果,然后由REPL耗尽)以及var ite = Iterator(...)为什么起作用(因为var的结果1}}声明是undefined)。