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.

Esta página tem editores executáveis — edite, execute e veja a saída na hora.

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:

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.

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

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:

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:

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

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:

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:

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:

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:

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

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:

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:

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:

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:

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):

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:

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.

Coddy programming languages illustration

Aprenda a programar com o Coddy

COMEÇAR