【问题标题】:Custom Iterator not working for the Array Object自定义迭代器不适用于数组对象
【发布时间】:2019-01-04 00:30:45
【问题描述】:
var array = [1, 2, 3, 4, 6, 6, 6, 6, 6];
array[Symbol.iterator] = (function() {
  var current = 0;
  console.log('executed')
  var iterator = {
    next: function() {
      var iteratorObject = {
        done: "undefined",
        value: false
      };
      //returns the next item in the sequence
      if (current != this.length) {

        iteratorObject.done = this[current];
        current++;

        //return false
        return iteratorObject;
      } else if (current === this.length) {
        //finished
        //return true
        iteratorObject.done = "undefined";
        iteratorObject.value = true;
        return iteratorObject;


      } else {
        console.log('something broke!')
      }

    }
  }
  return iterator;
})();   

在上面的代码中,我正在为我创建的数组对象编写一个自定义迭代器。但是,它一直使用内置的 Symbol.iterator 作为数组,为什么会这样呢?

这是我尝试运行自定义迭代器时的输出

您可以告诉它运行内置迭代器而不是我制作的自定义迭代器?

【问题讨论】:

  • 你是如何尝试“使用”这个迭代器的
  • 尝试在第一行结束后删除此2 号码。
  • @Azhy ya idk 为什么会在那里,但没有区别
  • 也许问题在于您正在使用 for...in 并认为它正在使用您的代码 - 它没有。 for...in 语句迭代对象的所有非符号、可枚举属性。 其中 for...of 语句创建循环迭代可迭代对象 - 这就是原因我在 20 分钟前问如何你使用这个 - 你似乎忽略了
  • 最后,array[Symbol.iterator] 需要是一个函数,但是因为})();,你已经把它变成了一个对象

标签: javascript arrays iterator


【解决方案1】:

这就是你出错的地方

  1. 您认为您没有覆盖 array.[Symbol.iterator] - 您的 console.log 证明您确实拥有
  2. for(i of array) 抛出错误 Uncaught TypeError: array is not iterable 因为你的代码错误
  3. 您还交换了 donevaluenext() 返回的含义
  4. 完成后,value 应该是值 undefined 而不是字符串 "undefined"
  5. array[Symbol.iterator] 需要是一个函数 - 但您已将其设置为 Object - 因为最终的 ()

解决所有问题,你得到

var array = [1, 2, 3, 4, 6, 6, 6, 6, 6];
array[Symbol.iterator] = function() {
    let current = 0;
    return {
        next: () => {
            if (current != this.length) {
                return { value: this[current++], done:false };
            } else if (current === this.length) {
                return {value:undefined, done:true};
            } else {
                console.log('something broke!')
            }

        }
    };
};
for(let i of array) {
    console.log(i);
}

【讨论】:

  • for 循环只是“测试”代码以显示它的工作原理 - 与实际用例无关:p 但为了完整性而这样做
  • 不,你是对的,答案应该使用“正确”的代码原则:p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2013-04-12
  • 1970-01-01
  • 2020-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多