JavaScript 迭代器

问题描述 投票:0回答:7

我在浏览 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

这是为什么呢? 迭代器函数是否已被弃用或者什么?我是否遗漏了一点? 感谢您的帮助和时间:-)

javascript
7个回答
6
投票

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

[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());
}

4
投票

window.Iterator
AFAIK 只存在于 Firefox 中,不存在于 WebKit 中。


3
投票

来自此线程

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

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

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

注意: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();

这里是链接,你可能会觉得有趣


0
投票

Iterator
已经过时,但获得了新的生命:

该问题涉及 JavaScript 1.7 时代 Firefox 中长期过时的

Iterator
函数实现,当时该函数不属于 ECMA-262 标准的一部分。

但是,从 ECMAScript 2025 开始,现在又出现了全局

Iterator
。它是一个抽象构造函数/类,因此返回迭代器的所有核心 JavaScript 函数都继承自
Iterator.prototype
,从而可以访问一组 迭代器辅助方法

所以现在你可以这样做:

const res = Array(1000).keys()  // Iterator for 0, 1, 2, 3, 4, ...
                       .map(n => n*n) // Iterator for 0, 1, 4, 16, 24, ...
                       .filter(n => n % 17 == 1) // Iterator for 1, 256, ...
                       .toArray(); // Consume iterator into array
console.log(res);

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.