Symbol.iterator

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since September 2015.

O símbolo conhecido Symbol.iterator especifíca o iterador padrão para um objeto. Usado por for...of.

Experimente

Descrição

Sempre que um objeto precisa ser iterado (como um começo de um for..of loop), o método @@iterator é chamado sem argumentos, e o iterador retornado é usado para obter os valores para serem iterados.

Alguns tipos built-in tem um comportamento padrão de iteração, enquanto outros tipos (assim como Object) não tem. O tipo built-in com um método @@iterator são:

Veja também Iteration protocols para mais informação.

Property attributes of Symbol.iterator
Writableno
Enumerableno
Configurableno

Exemplos

Iteráveis definidos pelo usuário

Podemos fazer nosso próprio iterável dessa forma:

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

Ou iteráveis podem ser definidos diretamente dentro de uma classe ou um objeto usando computed property:

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

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

[...new Foo] // [ 1, 2, 3 ]
[...someObj] // [ 'a', 'b' ]

Iteráveis não bem formados

Se um método @@iterator não retornar um objeto iterador, então é um iterável não bem formado. Usando dessa forma é resultará em uma excessão de tempo ou comportamentos com erros:

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

Especificações

Specification
ECMAScript Language Specification
# sec-symbol.iterator

Compatibilidade com navegadores

BCD tables only load in the browser

Veja também