shakiriker
@shakiriker

Как передавать Symbol.iterator в переменную?

let todoList = {
  todoItems: [],
  [Symbol.iterator]() {}
};

let iterableTodoList = todoList[Symbol.iterator];

for (let item of todoList) {
  console.log(item);
}


Возможно ли передавать Symbol.iterator в переменную ?
  • Вопрос задан
  • 36 просмотров
Пригласить эксперта
Ответы на вопрос 1
Xuxicheta
@Xuxicheta
инженер
[Symbol.iterator] это свойство в котором лежит функция возвращающая объект итератора.
Ну ээ можно ее записать в переменную, но зачем?

Функция сделана для того, чтобы при получении итератора можно было сделать какое-нибудь замыкание, где сохранить данные, уникальные для этого конкретного вызванного итератора. Т.е. при вызове итераторы можно сделать независимыми друг от друга.
Ну и любая функция может быть вызвана в контексте другого объекта, и итератор тоже.
Например
простой цикл
let todoList = {
  todoItems: [1, 2, 3, 4],
  [Symbol.iterator] () {
    console.log('начинаем перебирать массив по кругу!')
    let i = -1;
    return {
      next: () => {
        i += 1;
        if (i > 10) {
          return {
            done: true,
            value: null,
          }
        }
        return {
          done: false,
          value: this.todoItems[i % this.todoItems.length],
        }
      }
    };
  }
};

for (let item of todoList) {
  console.log(item);
}

let iterableTodoList = todoList[Symbol.iterator];
console.log(
  'А это символ-итератор в переменной, применим его к другому объекту', iterableTodoList
);

let todoList2 = {
  todoItems: ['a', 'b', 'c'],
  [Symbol.iterator]: iterableTodoList, 
};

for (let item of todoList2) {
  console.log(item);
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы