Desestruturação


A desestruturação é uma funcionalidade que o ES6 nos traz, ela existe a fim de facilitar e simplificar operações repetitivas e atribuições dentro do JavaScript.

Pela desestruturação, podemos tanto extrair dados em um nível mais profundo de um vetor (ou objeto) usando uma sintaxe mais sucinta quanto atribuir a esse dado "extraído" um nome alternativo nessa mesma operação.

No JavaScript, podemos realizar isso de uma forma bastante simples:

// considere este objeto:
const pessoa = {
    cabeca: {
        olhos: 'x',
        boca: {
            dentes: 'x',
            lingua: 'x'
        }
    },
    corpo: {
        ombros: 'x',
        peitos: 'x',
        braços: 'x',
        maos: 'x',
        pernas: 'x'
    }   
};

// se quiséssemos pegar sua cabeça como nos velhos tempos:
let cabeca = pessoa.cabeca;

// desestruturação do ES6:
let { cabeca } = pessoa;

// podemos dar, à cabeça extraída, outro nome, como se uma variável fosse declarada na mesma linha:
let { cabeca : minhaCabeca } = pessoa;

// olhando a nova cabeça...
console.log(minhaCabeca);

exibe '{ olhos: 'x', boca: { ... } }'

Em se tratando de vetores:

let numeros = ['2', '3', '7'];

// como nos velhos tempos:
let dois = numeros[0];
let tres = numeros[1];

// desestruturação do ES6:
let [ dois, tres ] = numeros;

// podemos dar-lhes outros nomes, como se novas variáveis fossem declaradas na mesma linha:
let [dois: posicaoZero, tres: posicaoUm] = numeros;

console.log(posicaoZero)      // exibe '2'
console.log(posicaoUm)        // exibe '3'

Também podemos fazer isso com parâmetros de funções:

// como nos velhos tempos:
function pegaCabecaECorpo(pessoa) {

    let cabecaECorpo = {
        cabeca: pessoa.cabeca,
        corpo: pessoa.corpo
    }

    return cabecaECorpo;
}

// desestruturação do ES6:
function pegaCabecaECorpo({ cabeca, corpo }) {
    return { cabeca, corpo }
}

// com funções seta
let pegaCabecaECorpo = ({ cabeca, corpo }) => { cabeca, corpo };

Aviso: tome cuidado com a desestruturação, pois se você não tiver certeza do recebimento de um objeto dotado dos exatos parâmetros, é melhor fazer da forma antiga a fim de evitar a ocorrência do erro "{nome do atributo} is undefined".

É possível evitar esse tipo de erro usando a desestruturação do ES6 ao definir valores padrão às variáveis, então será certa a existência dessas propridades, deixando de haver a completa dependência dos argumentos recebidos.

// não sei dizer se cabeça e/ou o corpo estarão presentes em alguns casos...

// agora, garantimos que tanto cabeça quanto o corpo existirão e serão iguais a " '' ", evitando que dê pau se o argumento recebido não carregar essas exatas propriedades
function pegaCabecaECorpo({ cabeca = '', corpo = '' }) {
    return { cabeca, corpo }
}

A desestruturação pode ocorrer a qualquer nível de profundidade, basta que esse atributo exista.

// desestruturação profunda
let computador = {
    processador: {
        transistor: {
            silicone: {
                grossura: '9nm'
            }
        }
    }
}

let { processador: { transistor: { silicone: { grossura } } } } = computador;

// simplificando
let { grossura: grossuraDoInteli9 } = computador.processador.transistor.silicone;

console.log(grossuraDoInteli9)

exibe '9nm'

Exercise

Obtenha a propriedade "legs" do objeto "person" e, também, os dados dentro da terceira posição do vetor "numbers" via desestruturação. Dê às variáveis obtidas os nomes de "myLegs" e "thirdPosition", respectivamente.


Copyright © learn-js.org. Read our Terms of Use and Privacy Policy