Menu

Destructuring em JavaScript: objetos, arrays e defaults

Entenda como funciona o destructuring em JavaScript: extrair valores de objetos e arrays, renomear variáveis, usar valores padrão, rest e parâmetros de função.

Destructuring em JavaScript: casamento de padrões sobre estruturas

A desestruturação (destructuring) permite escrever um padrão que espelha o formato de um objeto ou array e, em uma única linha, extrair valores por nome ou posição. Em vez de acessar propriedade por propriedade, você descreve o que quer e o JavaScript entrega.

Os dois sabores são:

index.js
Output
Click Run to see the output here.

As chaves fazem o match com um objeto pelo nome da propriedade. Os colchetes fazem o match com um array pela posição. Nos dois casos, as variáveis antes do = são novas declarações — você não está indexando o valor, está descrevendo um padrão que extrai as partes.

Antes do destructuring existir, esse mesmo código ficava assim:

const name = user.name;
const age = user.age;
const first = scores[0];
const second = scores[1];

Não é o fim do mundo, mas vira uma repetição chata quando você faz isso em toda função.

Desestruturação de objetos usa o nome das propriedades

No caso de objetos, os nomes dentro das chaves precisam bater com as propriedades do objeto de origem. A ordem não importa — o JavaScript faz a busca pela chave.

index.js
Output
Click Run to see the output here.

Quando a propriedade não existe no objeto, a variável fica como undefined — sem erro nenhum:

index.js
Output
Click Run to see the output here.

Esse comportamento silencioso de retornar undefined é importante ter em mente quando um errinho de digitação no nome da propriedade te deixa quebrando a cabeça às duas da manhã.

Renomeando variáveis no destructuring

Às vezes o nome da propriedade no objeto não é o nome que você quer pra variável — ou porque conflita com algo que já existe no escopo, ou porque a API usa uma convenção de nomenclatura que não te agrada. Use nomeOriginal: novoNome para renomear:

index.js
Output
Click Run to see the output here.

Leia como "pega a propriedade id e chama de userId." O nome da propriedade vem antes, o nome da nova variável depois dos dois-pontos. Parece anotação de tipo de outras linguagens — mas não é.

Destructuring com valor padrão

Quando uma propriedade pode não existir, já defina um valor padrão direto no próprio padrão de desestruturação:

index.js
Output
Click Run to see the output here.

Os valores padrão só entram em ação quando a propriedade é undefined. Já null, 0 e "" passam direto, sem acionar o default:

index.js
Output
Click Run to see the output here.

Essa pega muita gente. Se você quiser que null também dispare o valor padrão, precisa fazer uma checagem explícita — ou usar o operador de coalescência nula ?? depois de desestruturar.

Dá pra combinar valor padrão com renomeação:

index.js
Output
Click Run to see the output here.

Destructuring de arrays usa a posição

Arrays não têm nomes, apenas índices — por isso o padrão casa por posição. Use vírgulas para pular os valores que não te interessam:

index.js
Output
Click Run to see the output here.

As duas vírgulas no começo dizem "pula o índice 0 e o 1". Fica um pouco denso visualmente, mas quebra um galho enorme quando você só quer um valor lá do meio.

O destructuring de arrays brilha mesmo em funções que devolvem tuplas:

index.js
Output
Click Run to see the output here.

O mesmo padrão aparece o tempo todo nos hooks do React: const [count, setCount] = useState(0).

Rest pattern: juntando o que sobrou

Dentro de um padrão de desestruturação, ...nome reúne em uma nova variável tudo o que não foi capturado por nome ou posição.

No caso de arrays, o rest pega o final:

index.js
Output
Click Run to see the output here.

Já em objetos, o rest captura todas as propriedades que não foram nomeadas explicitamente:

index.js
Output
Click Run to see the output here.

Essa é a forma idiomática de remover um campo de um objeto sem mutá-lo — rest é um novo objeto com tudo, exceto id.

O rest precisa ser o último elemento do padrão. const [...init, last] gera erro de sintaxe.

Destructuring aninhado

Os padrões podem ser aninhados. Se uma propriedade é, ela mesma, um objeto ou array, dá para desestruturar direto na mesma expressão:

index.js
Output
Click Run to see the output here.

Poderoso, mas use com cautela. Três níveis de chaves aninhadas já começam a parecer um quebra-cabeça. Quando chegar nesse ponto, extraia valores intermediários para variáveis próprias — legibilidade vale mais do que esperteza.

Uma pegadinha: data: { user } no padrão não cria uma variável chamada data. Isso é uma instrução dizendo "entre em data e continue desestruturando". Se você precisa do próprio data, adicione separadamente:

index.js
Output
Click Run to see the output here.

Desestruturação nos parâmetros de função

O lugar onde você mais vai usar destructuring no dia a dia é na lista de parâmetros de uma função. Isso transforma aquele clássico "passa um objeto de opções" numa assinatura que já se documenta sozinha:

index.js
Output
Click Run to see the output here.

No ponto da chamada, parece uma função comum que recebe um objeto de opções. Só que, dentro da função, você já ganha variáveis nomeadas com valores padrão — chega daquele options.name || "default" repetido toda hora.

Tem uma pegadinha: chamar essa função sem argumento quebra tudo, porque não dá pra desestruturar undefined. A solução é dar um valor padrão pro parâmetro inteiro:

index.js
Output
Click Run to see the output here.

O = {} depois do padrão diz o seguinte: "se nenhum argumento for passado, finge que veio um objeto vazio". A partir daí, os valores padrão internos assumem o controle.

Trocando e reatribuindo valores

O destructuring também funciona com variáveis já declaradas, mas é preciso envolver o padrão do objeto em parênteses (caso contrário, o JavaScript interpreta o { como o início de um bloco):

index.js
Output
Click Run to see the output here.

O swap de arrays fica limpo demais. Já reatribuir objetos é mais raro, mas vale guardar o truque dos parênteses para quando precisar.

Um exemplo do mundo real

Juntando boa parte do que vimos até aqui — uma função que processa uma resposta de API:

index.js
Output
Click Run to see the output here.

Cada camada desestruturada tem um valor padrão, então a função sobrevive a dados incompletos sem uma pilha de if para proteger cada caso. Esse é o ganho de verdade: assinaturas ao mesmo tempo precisas e tolerantes.

Próximo passo: spread de objetos

A desestruturação tira valores de dentro de objetos. Já o spread faz o oposto — copia, mescla e sobrescreve. Os dois andam juntos no JavaScript moderno, e o spread é o nosso próximo tema.

Perguntas frequentes

O que é destructuring em JavaScript?

Destructuring (ou desestruturação) é uma sintaxe que permite extrair valores de objetos ou arrays e atribuí-los a variáveis em um único passo. const { name } = user; pega a propriedade name do objeto user. Já const [first, second] = list; pega os dois primeiros elementos de list. Na prática, é um padrão do lado esquerdo do = que espelha o formato do valor que está do lado direito.

Como renomear uma variável ao fazer destructuring?

Use a sintaxe { original: novoNome }. Por exemplo, const { name: username } = user; extrai a propriedade name de user e a atribui a uma variável local chamada username. Cuidado porque a sintaxe parece anotação de tipo — lembre-se de que o nome da propriedade vem primeiro e o nome da nova variável vem depois dos dois-pontos.

Dá para definir valores padrão com destructuring?

Dá sim. const { timeout = 5000 } = options; usa 5000 caso options.timeout seja undefined. Importante: o valor padrão só entra em ação quando o valor é undefinednull, 0 e '' passam direto, sem substituição. E você ainda pode combinar default com renomeação: const { t: timeout = 5000 } = options;.

Qual a diferença entre destructuring e spread?

A sintaxe parece parecida, mas fazem coisas opostas. Destructuring (const { a, b } = obj) tira valores de uma estrutura. Já o spread (const copy = { ...obj }) coloca valores dentro de uma nova estrutura. Quando você vê ... dentro de um padrão de destructuring, aí é o rest, que junta o que sobrou em uma nova variável.

Aprenda a programar com o Coddy

COMEÇAR