О Symbol.iterator и итераторах, итерируемых - PullRequest
1 голос
/ 10 марта 2019

На этой странице:

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 ...:

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

Итак, мы знаем, что для ... 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
}

Но они вызывают итератор по умолчанию. Они не вызывают итератор, который они сделали с нуля. Я предполагаю, что это невозможно с тем, что они создали с нуля из-за того, как работает возврат. Так есть ли для ... из специальных функций, которые не могут быть воссозданы? Как будто он знает, что помнит, в каком значении вы находитесь, и продолжаете оттуда и не выходит при возврате.

Это просто, чтобы помочь моему пониманию. Мне всегда нравится, когда они объясняют, как воссоздать существующую функциональность, и хотят знать, можно ли ее полностью создать без использования итератора по умолчанию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...