Node.js迭代器接口

我正在阅读关于迭代器和生成器的MDN指南,并且实现了以下示例:

function Range(low, high){ this.low = low; this.high = high; } Range.prototype.__iterator__ = function(){ return new RangeIterator(this); }; function RangeIterator(range){ this.range = range; this.current = this.range.low; } RangeIterator.prototype.next = function(){ if (this.current > this.range.high) throw StopIteration; else return this.current++; }; var range = new Range(3, 5); for (var i in range) { console.log(i); } 

但是我得到这个:

 low high __iterator__ 

它应该返回的地方:

 3 4 5 

是否有可能在Node.js中按预期实现?

注意:我正在使用node --harmony myscript.js

**编辑**

我还应该注意,我知道__iterator__只是一个Mozillafunction 。 我想知道什么是在Node.js中的等价物。 或者下一个最好的事情是什么。

另外,我想使用一个生成器,因为我想迭代没有任何条件testing。

我的结论是,唯一的等价物是

 Range.prototype.each = function (cb) { for (var i = this.low; i <= this.high; i++) { cb(i); } }; //... range.each(function (i) { console.log(i); }); 

有替代品吗?

我认为你的代码有一个错误,你写for (var i in range)而不是for (var i of range)in关键字打印出对象的属性,你想用它来实际得到迭代器的值。

无论如何,Node.js现在有更好的和谐支持,因为问题被问到。 这是一个更新的代码示例,可以在节点4.2上使用。 __iterator__名称已更改为Symbol.iterator,并且不使用StopIterationexception。

 "use strict"; function Range(low, high){ this.low = low; this.high = high; } Range.prototype[Symbol.iterator] = function(){ return new RangeIterator(this); }; function RangeIterator(range){ this.range = range; this.current = this.range.low; } RangeIterator.prototype.next = function(){ let result = {done: this.current > this.range.high, value: this.current}; this.current++; return result; }; var range = new Range(3, 5); for (var i of range) { console.log(i); } 

是的。

生成器和迭代器是ECMAScript 6 / JavaScript 1.7的一部分。 节点支持它们,但是在启动脚本时需要激活它们。

例如:

 node --harmony_generators --harmony_iteration your_script.js 

看看这个博客文章了解更多信息。