Symbol e Iterators
Função Symbol()
Retorna um valor do tipo symbol. Cada valor symbol retornado de Symbol() é único.symbol pode ser usado como identificador para propriedades de objetos, para criar meta-propriedades.
Tipo de dado symbol
É um tipo de dado primitivo, symbol data type.Para encontrar propriedades symbols em Objetos
Object.getOwnPropertySymbols()
Retorna um array contendo todos os symbols do objeto. *O array não contém os symbols herdados.
Observe que cada objeto é inicializado sem suas próprias propriedades de symbol, de modo que este array estará vazio, a menos que você estabeleça propriedades de symbol no objeto.
Symbol possui algumas propriedades chamadas de "well-known"
- Para criar symbol disponível em vários arquivos em um escopo como se fosse GLOBAL.
- Symbol.for()
- Symbol.keyFor()
- Para adicionar propriedades a Objetos.
- Symbol.split
- Symbol.toStringTag
- Symbol.iterator Especifica um Iterador padrão para um objeto. Used by for...of.
Iterator é uma interface de iteração.
Essa propriedade foi criada usando o Symbol porque evita colisão com outros nomes de propriedades.
Iterables Objects já possuem a propriedade Symbol.iterator nativamente.
Literals Objects não possuem a propriedade Symbol.iterator nativamente.
É possível implementar uma interface de iteração adicionando a propriedade Symbol.iterator a um objeto literal.
Interface de iteração
A propriedade Symbol.iterator gera o objeto Array Iterator que contém o método next() que retorna um objeto com as propriedades done e value (done = true se o objeto estiver completo, false se houver mais itens) para controlar a iteração.
O iterador construído com o Symbol.iterator tem como objetivo permitir que a iteração possa ocorrer passo a passo, sem precisar de um loop.
// Declaração
const arr = [1, 2, 3, 4];
const it = arr[Symbol.iterator](); // Cria o iterador
// Iteração com um Array Iterator
console.log(it.next()); // { value: 1, done: false }
console.log(it.next()); // { value: 2, done: false }
console.log(it.next()); // { value: 3, done: false }
console.log(it.next()); // { value: 4, done: false }
console.log(it.next()); // { value: undefined, done: true } // Finaliza a iteração
Exemplo com Literal Object
É necessário criar uma interface de iteração para tornar o objeto iterável.
// Declaração do Objeto
const obj = {
values: [1, 2, 3, 4],
[Symbol.iterator]: function () { // Cria o iterador
let i = 0;
return {
next: () => {
const done = i >= this.values.length;
const value = !done ? this.values[i++] : undefined;
return { value, done };
}
}
}
};
const it = obj[Symbol.iterator]();
console.log(it.next());
// Iteração com for...of porque agora temos um Iterables Objects
for(let value of obj){
console.log(value); // 1, 2, 3, 4
}
// Iteração com Spread Iterator porque agora temos um Iterables Objects
const arr = [...obj];
console.log(arr); // [1, 2, 3, 4]
- Iterables Objects já possuem nativamente interfaces de iteração.
- Literals Objects necessitam de implementação de uma interface de iteração.