Skip to content

Статья про "Итератор". Изменить пример добавления Symbol.iterator в произвольный объект #5972

@mrswylet

Description

@mrswylet

Ссылка на статью

https://doka.guide/js/iterator/

Описание

В статье есть следующий пример, показывающий, как сделать объект итерируемым.

person[Symbol.iterator] = function () {
  const properties = Object.keys(this)
  let count = 0

  return {
    next() {
      if (count < properties.length) {
        const key = properties[count]
        let result = { done: false, value: person[key] }
        count++
        return result
      } else {
        return { done: true }
      }
    }
  }
}

Предлагаю немного изменить его.

  1. Запомнить через замыкание this в начале функции, например _this.
  2. При получении значения value через метод next получать значение из _this, а не через объект person.

Зачем это?

Это уменьшит вероятность случайных ошибок при копировании примера.

Итоговый вариант

person[Symbol.iterator] = function () {
  const _this = this;
  const properties = Object.keys(this)
  let count = 0

  return {
    next() {
      if (count < properties.length) {
        const key = properties[count]
        let result = { done: false, value: _this[key] }
        count++
        return result
      } else {
        return { done: true }
      }
    }
  }
}

Готов сделать PR, если авторы согласны с правкой.

Пруфы

No response

Metadata

Metadata

Assignees

Labels

jsКонтент по JavaScriptошибкаЧто-то критичное и мешает

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions