JavaScript

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"

Exemplo com Array

                            // 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]
                        

References