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