当我运行以下Javascript脚本
时ite=Iterator(["aaa","bbb"])
ite.next()
我总是收到如下错误信息。
http://i39.tinypic.com/9gd8w8.png
但它是我创建它之后的第一个next(),为什么迭代器停止工作?另外,为什么我们在Javascript中创建对象时可以省略“new”?我在MongoDB v2.2.4客户端中使用Javascript。
答案 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
)。