Operators ES6

Rest Operator

Transforma argumentos da função em array.
O que era um elemento independente se torna parte de um array.
Permite receber quantidade indefinida de argumentos, independente da definição da função.

Receber argumentos em uma função

Exemplo ES5
Usa-se o objeto "arguments" para receber os argumentos.
Inexistente em Arrow Functions.

                                function fn(a, b, c, d){
                                    console.log(arguments);
                                    for(var i=0; i < arguments.length; i++){
                                        console.log(arguments[i])
                                    }
                                }
                            
Exemplo ES6

                                // Regular Function
                                    function sum(...args){
                                        console.log(args);
                                        return args.reduce((total, nextValue) => total + nextValue, 0);
                                    }

                                // Arrow Function
                                    const sum = (...args) => {
                                        console.log(args); 
                                        return args.reduce((total, nextValue) => total + nextValue, 0);
                                    }

                                // Pode ser usado para pegar argumentos restantes
                                    function sum(a, b, ...args){
                                        console.log(a, b, args);
                                        return a + b + args.reduce((total, nextValue) => total + nextValue, 0);
                                    } 
                            

Spread Operator

Transforma objetos e arrays em argumentos.
O que era parte de um array/object se torna um elemento independente.
Permite quebrar os itens do array e repassar para algum lugar.

Usabilidade

Functions Parameters

Arrays (Object Iterable)

                                var arr = [1, 2, 3];                
                                function fn(x, y, z){ 
                                    console.log(x, y, z) 
                                };
                                fn(...arr);
                            
String (Object Iterable)

                                const str = 'Digital Innovation One';
                                function logArgs(...args){
                                    console.log(args);
                                }
                                logArgs(...str);
                            

Construção de NOVAS estruturas

Arrays (Iterable Objects)

                                var arr1 = [1, 2, 3];
                                var arr2 = [4, 5, 6];

                                // ES5
                                    var arr3 = [4, 5, 6].concat(arr1); // [4, 5, 6, 1, 2, 3]
                                    var arr3 = arr1.concat(arr2);      // [1, 2, 3, 4, 5, 6]
                                // ES6
                                    var arr3 = [4, 5, 6, ...arr1]; // [4, 5, 6,  1, 2, 3]
                                    var arr3 = [...arr1, 4, 5, 6]; // [1, 2, 3, 4, 5, 6]                 
                                    var arr3 = [...arr1, ...arr2]; // [1, 2, 3, 4, 5, 6]
                                    var arr3 = ['x',...arr1,'y'];  // ['x', 1, 2, 3, 'y']
                                    var arr3 = [...arr1,...arr2,...arr3] 
                                    var arr3 = [...arr1]; // [1, 2, 3]  
                            
Objetos (literal Objects)

                                const obj1 = { test1: 123 };

                                // Construção de NOVOS objetos (NÃO altera objetos já definidos)
                                const obj2 = { ...obj1, test2: 456 };     // { test1: 123, test2: 456 }
                                const obj3 = { ...obj1, test2: 'teste' }; // { test1: 789, test2: 'teste' }

                                // Objetos literables não podem ser usados para construir objetos iterables.
                                var arr = [...obj1]; // Uncaught TypeError: obj1 is not iterable

                                // A ORDEM importa (Propriedades com mesmo nome) = Prevalece o último
                                const obj4 = {...obj1, test1: 456}; // { test1: 456 } 
                                const obj5 = {test1: 456, ...obj1}; // { test1: 123 } 
                                const obj6 = {...obj4, ...obj5};    // { test1: 123 } 
                            

Rest Operator vs Spread Operator

Rest transforma argumentos em array. Usa quando está declarando a função.
Spread transforma array em argumentos. Usa quando está chamando a função.
Ambos possuem a mesma sintaxe: ...ope

Boa Prática

Tipos de referência NUNCA devem ser copiados diretamente, porque a referência também é copiada, assim sempre que um for alterado, será replicado para o outro também.
Sendo assim, é RECOMENDADO sempre criar NOVAS estruturas, e o Spread é uma das boas formas de fazer isso em um formato não verbosa, mais simples e legível.

Destructuring Assigment ou Destructuring Object

Atribuição via desestruturação de um objeto ou array.
Atribuição de uma estrutura composta (object/array) para estruturas simples (variáveis).
Expressão que possibilita extrair itens de arrays/objetos em variáveis distintas.
Usa-se chaves {} para filtrar apenas os itens desejados.

Usabilidade

Exemplo com objeto
Lista nomeada, o que importa são os nomes, e não a ordenação.

                                const obj = { name: 'Heviane', lastName: 'Bastos', age: 39 };

                                const { age, name } = obj;

                                function fn( {name} ){ 
                                    console.log(name); 
                                };
                            
Outro exemplo, com mais de um nível.

                                const user = {
                                    id: 1,
                                    age: 39,
                                    fullName: {
                                        firstName: 'Heviane',
                                        lastName: 'Bastos'
                                    }
                                }

                                const { fullName: { firstName, lastName } } = user;

                                function fn( {fullName: { firstName, lastName } } ){ 
                                    console.log(firstName, lastName); 
                                };
                            
Exemplo com array
Lista indexada, o que importa é a ordenação, e não os nomes.

                                const arr = [ 'Heviane', 'Bastos', 39];
                                const [ name , , age ] = arr;
                            

References

  • Reference/Functions/rest_parameters
  • Reference/Operators/Spread_syntax
  • Reference/Operators/Destructuring_assignment