Symbol.iterator
Базовая версия Широко доступно
Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с сентября 2015 года.
Статическое свойство данных **Symbol.iterator** представляет собой общеизвестный символ Symbol.iterator. Протокол итерации (iterable protocol) ищет этот символ для метода, который возвращает итератор для объекта. Чтобы объект был итерируемым, он должен иметь ключ [Symbol.iterator].
Попробовать
const iterable = {};
iterable[Symbol.iterator] = function* () {
yield 1;
yield 2;
yield 3;
};
console.log([...iterable]);
// Expected output: Array [1, 2, 3]
Значение
Общеизвестный символ Symbol.iterator.
Атрибуты свойства Symbol.iterator
| |
|---|---|
| Записываемое | нет |
| Перечислимое | нет |
| Конфигурируемое | нет |
Описание
Всякий раз, когда объект необходимо итерировать (например, в начале цикла for...of), вызывается его метод [Symbol.iterator]() без аргументов, а возвращенный итератор используется для получения итерируемых значений.
Некоторые встроенные типы имеют поведение итерации по умолчанию, в то время как другие типы (такие как Object) — нет. Некоторые встроенные типы, имеющие метод [Symbol.iterator]():
Array.prototype[Symbol.iterator]()TypedArray.prototype[Symbol.iterator]()String.prototype[Symbol.iterator]()Map.prototype[Symbol.iterator]()Set.prototype[Symbol.iterator]()
См. также Протоколы итерации для получения дополнительной информации.
Примеры
Определяемые пользователем итерируемые объекты
Мы можем создать свои собственные итерируемые объекты следующим образом:
const 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 "a";
yield "b";
},
};
console.log(...new Foo()); // 1, 2, 3
console.log(...someObj); // 'a', 'b'
Некорректно сформированные итерируемые объекты
Если метод [Symbol.iterator]() итерируемого объекта не возвращает объект-итератор, то это некорректно сформированный итерируемый объект. Его использование, скорее всего, приведет к исключениям во время выполнения или к некорректному поведению:
const nonWellFormedIterable = {};
nonWellFormedIterable[Symbol.iterator] = () => 1;
[...nonWellFormedIterable]; // TypeError: [Symbol.iterator]() returned a non-object value
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Chrome | Edge | Firefox | Opera | Safari | Chrome Android | Firefox for Android | Opera Android | Safari on iOS | Samsung Internet | WebView Android | WebView on iOS | Bun | Deno | Node.js | |
iterator |
43 |
12 |
36 |
30 |
10 |
43 |
36 |
30 |
10 |
4.0 |
43 |
10 |
1.0.0 |
1.0 |
0.12.0 |
Смотрите также
- Полифил
Symbol.iteratorвcore-js - Протоколы итерации
Array.prototype[Symbol.iterator]()TypedArray.prototype[Symbol.iterator]()String.prototype[Symbol.iterator]()Map.prototype[Symbol.iterator]()Set.prototype[Symbol.iterator]()arguments[Symbol.iterator]()Segments.prototype[Symbol.iterator]()
© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol/iterator