8

我正在浏览 MDN(Mozilla 开发者网络)并遇到了迭代器和生成器

所以很自然地,我尝试了 Google Chrome v21 页面中给出的代码片段。具体来说,这段代码:

var it = Iterator(lang);
for (var pair in it)
  print(pair); // prints each [key, value] pair in turn

但是,控制台返回此错误消息:

ReferenceError: Iterator is not defined

为什么?Iterator 函数是否已弃用?我错过了一点吗?感谢您的帮助和时间:-)

4

6 回答 6

6

数组有一个内置的 map 函数,其作用类似于迭代器。

[1,2,3].map(function(input){console.log(input)});

标准输出:

1
2
3

最坏的情况是你可以很容易地设计一个迭代器对象,但没有完全测试它,但如果有任何错误,你应该能够快速让它工作。

var Iterator = function(arr){ return {
    index : -1,
    hasNext : function(){ return this.index <= arr.length; },
    hasPrevious: function(){ return this.index > 0; },

    current: function(){ return arr[ this["index"] ]; },

    next : function(){
        if(this.hasNext()){
            this.index = this.index + 1;            
            return this.current();
        } 
        return false;
    },

    previous : function(){
        if(this.hasPrevious()){
            this.index = this.index - 1
            return this.current();
        }
        return false;
    }
}   
};

var iter = Iterator([1,2,3]);

while(iter.hasNext()){
    console.log(iter.next());
}
于 2013-01-04T21:54:16.123 回答
4

window.IteratorAFAIK 仅存在于 Firefox 中,而不存在于 WebKit 中。

于 2012-08-22T18:45:18.993 回答
3

这个线程

V8 是 ECMAScript 的实现,而不是 JavaScript。后者是 Mozilla 制作的 ECMAScript 的非标准化扩展。

V8 旨在与 JSC 插件兼容,JSC 是 WebKit/Safari 中的 ECMAScript 实现。因此,它实现了许多也在 JSC 中的 ECMAScript 的非标准扩展,其中大部分也是 Mozilla 的 JavaScript 语言。

没有计划将 JSC 中没有的非标准特性添加到 V8。

注意:JSC 代表JavaScript Core - WebKit ECMAScript 实现。

于 2012-08-22T18:46:56.540 回答
2
var makeIterator = function (collection, property) {
    var agg = (function (collection) {
    var index = 0;
    var length = collection.length;

    return {
      next: function () {
        var element;
          if (!this.hasNext()) {
            return null;
          }
          element = collection[index][property];
          index = index + 1;
          return element;
        },
      hasNext: function () {
        return index < length;
      },
      rewind: function () {
        index = 0;
      },
      current: function () {
        return collection[index];
      }
    };
 })(collection);

 return agg;
};


var iterator = makeIterator([5,8,4,2]);

console.log(iterator.current())//5
console.log(  iterator.next() )
console.log(iterator.current()) //8
console.log(iterator.rewind());
console.log(iterator.current()) //5
于 2014-07-07T07:47:53.930 回答
1

这意味着 Chrome v21 不支持 JavaScript 的该功能。它是 1.7 规范的一部分。尝试这样做可能有助于在 Chrome 中明确指定 1.7 支持。

于 2012-08-22T18:47:02.247 回答
0

对于铬,你可以使用这个

var someArray = [1, 5, 7];
var someArrayEntries = someArray.entries();

这是链接,您会发现它很有趣

于 2015-03-21T08:50:00.040 回答