Symbol.iterator

Добревідомий символ Symbol.iterator визначає для об'єкта ітератор за замовчуванням. Використовується циклом for...of.

Опис

Коли виникає необхідність перебрати об'єкт (наприклад, на початку циклу for..of), його метод @@iterator викликається без аргументів, а ітератор, який він повертає, використовується для отримання значень, що перебираються.

Деякі вбудовані типи мають визначену за замовчуванням поведінку під час перебору, в той час, як інші типи (такі як Object) її не мають. Вбудовані типи, що мають метод @@iterator, наступні:

Дивіться більше інформації у статті Протоколи перебору.

Атрибути поля Symbol.iterator
Доступний для запису ні
Доступний для переліку ні
Доступний для налаштування ні

Приклади

Створені користувачем ітерабельні об'єкти

Ми можемо створювати власні ітерабельні об'єкти наступним чином:

var myIterable = {}
myIterable[Symbol.iterator] = function* () {
    yield 1;
    yield 2;
    yield 3;
};
[...myIterable] // [1, 2, 3]

Або ітерабельні об'єкти можна визначити безпосередньо всередині класу чи об'єкта, використовуючи обчислювані властивості:

class Foo {
  *[Symbol.iterator] () {
    yield 1;
    yield 2;
    yield 3;
  }
}

const someObj = {
  *[Symbol.iterator] () {
    yield 'а';
    yield 'б';
  }
}

[...new Foo] // [ 1, 2, 3 ]
[...someObj] // [ 'а', 'б' ]

Погано сформовані ітерабельні об'єкти

Якщо метод ітерабельного об'єкта @@iterator не повертає об'єкт ітератора, то це погано сформований ітерабельний об'єкт. Використання його в такому вигляді ймовірно призведе до викидання винятків під час виконання або помилкової поведінки:

var nonWellFormedIterable = {}
nonWellFormedIterable[Symbol.iterator] = () => 1
[...nonWellFormedIterable] // TypeError: [] is not a function

Специфікації

Специфікація Статус Коментар
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Symbol.iterator' in that specification.
Standard Початкове визначення.
ECMAScript Latest Draft (ECMA-262)
The definition of 'Symbol.iterator' in that specification.
Draft

Сумісність з веб-переглядачами

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
iteratorChrome Full support 43Edge Full support 12Firefox Full support 36IE No support NoOpera Full support 30Safari Full support 10WebView Android Full support 43Chrome Android Full support 43Firefox Android Full support 36Opera Android Full support YesSafari iOS Full support 10Samsung Internet Android Full support 4.0nodejs Full support 0.12

Legend

Full support  
Full support
No support  
No support

Див. також