首页 > 解决方案 > 关于 Symbol.iterator 和迭代器,iterables

问题描述

在本页面:

https://javascript.info/iterable

他们通过从头构建迭代器来解释迭代器的工作原理:

let range = {
  from: 1,
  to: 5,

  [Symbol.iterator]() {
    this.current = this.from;
    return this;
  },

  next() {
    if (this.current <= this.to) {
      return { done: false, value: this.current++ };
    } else {
      return { done: true };
    }
  }
};

for (let num of range) {
  alert(num); // 1, then 2, 3, 4, 5
}

基本上,迭代器必须返回一个像这样的对象: { done: boolean, value: current value }

然后使用 for...of 循环开始工作:

for (let num of range) {
  alert(num); // 1, then 2, 3, 4, 5
}

所以我们知道 for...of 调用迭代器及其下一个函数。我们只知道它有效。但随后他们解释了我们如何使用以下代码显式调用它们:

let str = "Hello";

// does the same as
// for (let char of str) alert(char);

let iterator = str[Symbol.iterator]();

while (true) {
  let result = iterator.next();
  if (result.done) break;
  alert(result.value); // outputs characters one by one
}

但他们正在调用默认迭代器。他们没有调用他们从头开始制作的迭代器。我认为由于 return 的工作原理,他们从头开始创建的那个是不可能的。那么 for...of 是否具有无法重新创建的特殊功能?就像它知道记住你的价值并从那里继续并且不会在返回时退出一样。

这只是为了帮助我理解。我总是喜欢他们解释如何重新创建现有功能并想知道是否可以在不使用默认迭代器的情况下完全重新创建它。

标签: javascriptiteratoriterable

解决方案


推荐阅读