3

当我运行以下 Javascript 脚本时

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

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

在此处输入图像描述

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

4

1 回答 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,但我不知道为什么将 Iterator 设为全局会导致它无法迭代。如果有人对此有任何见解,我很想听听。

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

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

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

于 2013-05-23T16:52:42.843 回答