【问题标题】:JavaScript IteratorsJavaScript 迭代器
【发布时间】:2012-08-18 05:57:15
【问题描述】:

我在浏览 MDN(Mozilla 开发者网络)时遇到了Iterators and generators

很自然,我尝试了 Google Chrome v21 页面中给出的代码 sn-ps。具体来说,这段代码:

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

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

ReferenceError: Iterator is not defined

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

【问题讨论】:

标签: javascript


【解决方案1】:

数组有一个内置的 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());
}

【讨论】:

  • Maybee hasNext : function(){ return this.index
  • 为对象添加 var arr= Object.keys(arr);
【解决方案2】:

window.IteratorAFAIK 只存在于 Firefox,不存在于 WebKit。

【讨论】:

    【解决方案3】:

    来自this thread

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

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

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

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

    【讨论】:

      【解决方案4】:
      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
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

          对于 chrome,你可以使用这个

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

          这里是link,你会觉得很有趣

          【讨论】:

            猜你喜欢
            • 2011-02-08
            • 2020-06-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-12-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多