JavaScript 迭代器

8

我正在查阅Mozilla开发者网络(MDN),并发现了迭代器和生成器

自然而然地,我在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函数已经被弃用了吗?我有什么遗漏的地方吗?谢谢你的帮助和时间 :-)

3
有些相关:Google Chrome - JavaScript版本 - j.w.r
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());
}

1
可能 hasNext: function() { return this.index < arr.length-1; }, ? - zloctb
为对象添加:var arr = Object.keys(arr); - zloctb

4

window.Iterator 据我所知只存在于Firefox中,而不是WebKit。


3

来自这个讨论

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

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

没有计划向V8添加未包含在JSC中的非标准功能。

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


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

1

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


0

对于Chrome,您可以使用这个

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

这里有一个链接, 你可能会觉得很有趣


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接