关于Symbol.iterator和迭代器,可迭代

时间:2019-03-10 18:09:45

标签: javascript iterator iterable

在此页面上:

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
}

基本上,迭代器必须返回这样的对象:{完成:布尔值,值:当前值}

然后使用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
}

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

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

0 个答案:

没有答案