Pular para o conteúdo
Cursos

DevClub

LógicaFront-endBack-endMobile

IA Club

IA na prática
Estudar programaçãoEstudar IA
LiçãoIniciantecódigo testado

Objetos em JavaScript: criar, acessar e alterar

Notação de ponto contra colchetes, chave dinâmica, chave computada, shorthand e delete — com o SyntaxError que a chave numérica provoca no Node.

Rodolfo Mori7 min de leitura

Objeto é a estrutura que guarda dados com nome: um cliente tem nome, email e cidade; um pedido tem id, total e status. Enquanto o array organiza por posição, o objeto organiza por rótulo — e é por isso que praticamente toda resposta de API chega como objeto.

A resposta curta para as duas dúvidas mais comuns: use ponto quando você sabe o nome da chave enquanto escreve o código, e colchetes quando o nome só existe em tempo de execução. E const num objeto não impede alterar as propriedades dele — impede apenas apontar o nome para outro objeto.

Uma ficha com campos nomeados, não uma gaveta por posição

Uma ficha de cliente não pede “dado zero, dado um, dado dois”. Ela tem campos com nome: nome, email, cidade. É por isso que um objeto combina com dados de negócio: você encontra a informação pelo rótulo, sem precisar lembrar em qual posição ela foi guardada.

Em JavaScript, um objeto é uma coleção de pares chave–valor. A notação de ponto usa uma chave conhecida no código; a de colchetes avalia uma expressão e descobre a chave em tempo de execução. Antes de executar o primeiro exemplo, tente ler em voz alta cada acesso como “na ficha pedido, campo total”; a saída confirma se o rótulo escolhido existe.

js
const cliente = {
  nome: 'Ana Souza',
  email: 'ana@exemplo.com.br',
  cidade: 'Sorocaba',
  vip: true,
};

console.log(cliente.nome);
console.log(cliente.cidade, cliente.vip);
console.log(cliente.telefone);
console.log(cliente);
Ana Souza Sorocaba true undefined { nome: 'Ana Souza', email: 'ana@exemplo.com.br', cidade: 'Sorocaba', vip: true }

A terceira linha é importante: pedir uma propriedade que não existe não é erro. O JavaScript devolve undefined e segue em frente. Isso é conveniente e é também a origem do erro mais comum da linguagem, quando alguém encadeia outro acesso logo depois.

Colchetes: quando a chave é uma variável

js
const pedido = {
  id: 1043,
  cliente: 'Ana Souza',
  total: 1638.8,
  status: 'pago',
};

const campo = 'status';

console.log(pedido[campo]);
console.log(pedido['total']);
console.log(pedido.campo);
pago 1638.8 undefined

pedido[campo] lê o valor da variável campo e procura a chave status. pedido.campo procura literalmente uma chave chamada campo, que não existe. Essa confusão aparece sempre que alguém escreve um filtro genérico ou uma tabela com colunas configuráveis.

Chaves que o ponto não alcança

Resposta de API raramente respeita as convenções do seu código. Chave com espaço, com hífen ou começando por dígito só é acessível por colchetes:

js
const respostaDaTransportadora = {
  'prazo em dias': 4,
  'valor-frete': 27.4,
  2024: 'tabela antiga',
};

console.log(respostaDaTransportadora['prazo em dias']);
console.log(respostaDaTransportadora['valor-frete']);
console.log(respostaDaTransportadora['2024']);
console.log(respostaDaTransportadora[2024]);
console.log(Object.keys(respostaDaTransportadora));
4 27.4 tabela antiga tabela antiga [ '2024', 'prazo em dias', 'valor-frete' ]

Duas coisas nessa saída. Primeiro: ['2024'] e [2024] levam à mesma propriedade, porque toda chave de objeto é string — o número é convertido antes da busca. Segundo: a chave numérica apareceu na frente das outras em Object.keys, mesmo tendo sido escrita por último. Essa ordem tem regra, e ela está detalhada em percorrer objeto em JavaScript.

Atalho de propriedade e desestruturação

Quando o nome da variável já é o nome que a chave deve ter, não repita:

js
const nome = 'Teclado mecânico';
const preco = 289.9;
const estoque = 12;

const produto = { nome, preco, estoque };

console.log(produto);

const { nome: nomeDoProduto, preco: precoDoProduto } = produto;
console.log(nomeDoProduto, precoDoProduto);
{ nome: 'Teclado mecânico', preco: 289.9, estoque: 12 } Teclado mecânico 289.9

{ nome, preco, estoque } é a forma curta de { nome: nome, preco: preco, estoque: estoque }. A segunda parte é o caminho inverso — a desestruturação — com renomeação usando dois-pontos. Repare que : significa coisas diferentes nos dois lados: na criação ele separa chave e valor; na desestruturação ele renomeia a variável.

Chave computada na criação

Colchetes também funcionam dentro do literal, e é assim que se monta um objeto cuja chave só se sabe em tempo de execução:

js
const campoDoFiltro = 'categoria';
const valorDoFiltro = 'periferico';

const filtro = {
  [campoDoFiltro]: valorDoFiltro,
  [`ordenar_por_${campoDoFiltro}`]: 'asc',
};

console.log(filtro);

const filtroErrado = { campoDoFiltro: valorDoFiltro };
console.log(filtroErrado);
{ categoria: 'periferico', ordenar_por_categoria: 'asc' } { campoDoFiltro: 'periferico' }

Sem os colchetes, o nome da variável vira a chave, literalmente. Com eles, o JavaScript avalia a expressão — inclusive um template string inteiro — e usa o resultado como nome da propriedade.

Alterar, adicionar e o que const protege

Atribuir a uma chave que existe altera; atribuir a uma que não existe cria:

js
const pedido = { id: 1043, status: 'aguardando', total: 1638.8 };

pedido.status = 'pago';
pedido.pagoEm = '2026-05-14';
pedido['codigo-rastreio'] = 'BR9128374LP';

console.log(pedido);
{ id: 1043, status: 'pago', total: 1638.8, pagoEm: '2026-05-14', 'codigo-rastreio': 'BR9128374LP' }

Repare que o Node imprime 'codigo-rastreio' entre aspas e as outras chaves sem — ele mostra aspas exatamente nas chaves que o ponto não alcançaria.

E o objeto foi declarado com const. A fronteira é esta:

js
const pedido = { id: 1043, status: 'aguardando' };

pedido.status = 'pago';
console.log(pedido);

pedido = { id: 1044, status: 'novo' };
{ id: 1043, status: 'pago' } file:///private/tmp/loja/objetos/objeto-const.mjs:6 pedido = { id: 1044, status: 'novo' }; ^ TypeError: Assignment to constant variable. at file:///private/tmp/loja/objetos/objeto-const.mjs:6:8 Node.js v24.16.0

Mudar por dentro: permitido. Trocar o objeto inteiro: erro. É o mesmo comportamento que a lição de variáveis em JavaScript explica com let, var e Object.freeze.

Remover propriedade: delete contra = undefined

Não são a mesma coisa, e a diferença aparece em qualquer código que percorre as chaves:

js
const cliente = { nome: 'Ana Souza', cpf: '000.000.000-00', cidade: 'Sorocaba' };

cliente.cidade = undefined;
console.log(cliente);
console.log('cidade' in cliente, Object.keys(cliente).length);

delete cliente.cpf;
console.log(cliente);
console.log('cpf' in cliente, Object.keys(cliente).length);
{ nome: 'Ana Souza', cpf: '000.000.000-00', cidade: undefined } true 3 { nome: 'Ana Souza', cidade: undefined } false 2

cidade continua existindo depois de receber undefined — o operador in confirma, e ela ainda conta em Object.keys. cpf, depois do delete, sumiu de verdade.

Objeto dentro de objeto

Estrutura aninhada é a regra em dado de e-commerce, e cada nível é uma chance de o acesso falhar:

js
const pedido = {
  id: 1043,
  cliente: {
    nome: 'Ana Souza',
    endereco: { cidade: 'Sorocaba', uf: 'SP', cep: '18010-000' },
  },
};

console.log(pedido.cliente.endereco.cidade);
console.log(pedido.cliente.endereco.complemento);
console.log(pedido.entrega?.transportadora?.nome);
console.log(pedido.entrega.transportadora.nome);
Sorocaba undefined undefined file:///private/tmp/loja/objetos/objeto-aninhado.mjs:12 console.log(pedido.entrega.transportadora.nome); ^ TypeError: Cannot read properties of undefined (reading 'transportadora') at file:///private/tmp/loja/objetos/objeto-aninhado.mjs:12:28 Node.js v24.16.0

A segunda linha mostra que uma chave faltando num objeto que existe devolve undefined em paz. A quarta mostra o que acontece quando o objeto do meio não existe. O ?. da terceira linha curto-circuita a expressão inteira e devolve undefined em vez de quebrar — o diagnóstico completo está em TypeError: Cannot read properties of undefined.

Copiar e mesclar com spread

js
const padrao = { frete: 27.4, embalagemPresente: false, prazoEmDias: 6 };
const escolhaDoCliente = { embalagemPresente: true };

const opcoes = { ...padrao, ...escolhaDoCliente };
console.log(opcoes);
console.log(padrao);

const original = { cliente: 'Ana', endereco: { cidade: 'Sorocaba' } };
const copia = { ...original };
copia.endereco.cidade = 'Campinas';
console.log(original.endereco.cidade, copia.endereco.cidade);

const copiaFunda = structuredClone(original);
copiaFunda.endereco.cidade = 'Recife';
console.log(original.endereco.cidade, copiaFunda.endereco.cidade);
{ frete: 27.4, embalagemPresente: true, prazoEmDias: 6 } { frete: 27.4, embalagemPresente: false, prazoEmDias: 6 } Campinas Campinas Campinas Recife

As duas primeiras linhas mostram o padrão de configuração: o objeto da direita sobrescreve o da esquerda, e o padrao não foi tocado. A terceira mostra o limite do spread: ele copia só o primeiro nível, então copia recebeu a mesma referência de endereco — mudar a cidade pela cópia mudou as duas, e por isso os dois nomes imprimem Campinas. A quarta linha é o contraste: structuredClone duplicou também o objeto de dentro, e a cidade nova ficou presa na cópia enquanto o original seguiu como estava.

Método e getter

Uma função guardada numa propriedade é um método, e dentro dele this aponta para o objeto que fez a chamada:

js
const carrinho = {
  itens: [
    { nome: 'Teclado mecânico', preco: 289.9 },
    { nome: 'Mouse sem fio', preco: 149.9 },
  ],
  total() {
    return this.itens.reduce((soma, item) => soma + item.preco, 0);
  },
  get quantidade() {
    return this.itens.length;
  },
};

console.log(carrinho.total().toFixed(2));
console.log(carrinho.quantidade);
439.80 2

quantidade é um getter: acessa como propriedade, executa como função. Note que total foi escrito com function implícito e não como arrow — método de objeto nunca é arrow, pelo motivo que a lição de funções em JavaScript demonstra com o this undefined.

Erros comuns: o ponto na chave numérica

Chave que começa por dígito com notação de ponto não é um acesso que falha: é código que nem chega a rodar.

js
const faturamento = {
  2024: 890400,
  2025: 1240900,
};

console.log(faturamento.2024);
file:///private/tmp/loja/objetos/objeto-erro-sintaxe.mjs:6 console.log(faturamento.2024); ^^^^^^^^^^^ SyntaxError: missing ) after argument list Node.js v24.16.0

A mensagem parece falar de parêntese, e é isso que despista. O motor leu faturamento, encontrou um ponto seguido de dígito, tentou interpretar .2024 como parte de um número decimal e perdeu o fio da meada — daí a reclamação sobre a lista de argumentos. O objeto está correto; o acesso é que precisa ser faturamento[2024].

O primo desse erro é a chave com hífen, que produz uma mensagem ainda mais enganosa:

js
const cabecalhos = { 'content-type': 'application/json' };

console.log(cabecalhos.content-type);
file:///private/tmp/loja/objetos/objeto-hifen.mjs:3 console.log(cabecalhos.content-type); ^ ReferenceError: type is not defined at file:///private/tmp/loja/objetos/objeto-hifen.mjs:3:32 Node.js v24.16.0

O motor leu cabecalhos.content menos type — uma subtração entre uma propriedade e uma variável que não existe. Nada indica que o problema é a chave. Sempre que aparecer um is not defined com o nome que vem depois de um hífen, o acesso é por colchetes.

Ponto ou colchetes, na prática

situação forma exemplo
chave conhecida ao escrever o código ponto pedido.status
chave numa variável colchetes pedido[campo]
chave com espaço ou hífen colchetes resposta['valor-frete']
chave que começa por dígito colchetes faturamento[2024]
chave montada na hora colchetes no literal { [chave]: valor }

Objetos ficam mais úteis quando você precisa percorrer as chaves — contar, somar, transformar. É o assunto de percorrer objeto em JavaScript, a próxima lição da trilha de JavaScript. E quando os objetos viram uma lista, as receitas estão em array de objetos. O guia completo de JavaScript mostra a sequência de estudo.

Prefere aprender em vídeo?

Tem uma aula sobre este assunto no nosso canal.

Ver todos os vídeos do canal
  • objetos
  • propriedades
  • spread
  • delete
  • desestruturacao

Perguntas frequentes

Quando usar colchetes em vez de ponto?
Use colchetes em três situações: a chave está numa variável, a chave veio de fora (formulário, API, parâmetro de função) ou a chave tem caractere que o ponto não aceita, como espaço, hífen ou dígito inicial. Fora disso, ponto é mais legível e mais fácil de buscar no editor.
delete ou atribuir undefined?
Depende do que a chave significa. Atribuir undefined mantém a propriedade existindo com valor vazio, e ela continua aparecendo em Object.keys e no JSON. delete tira a chave do objeto. Para um payload que vai virar JSON, a diferença é visível: undefined some da serialização, mas a chave continua contando no seu código até você apagá-la.
Se const não impede alterar propriedade, como travo o objeto?
Com Object.freeze, que impede adicionar, remover e alterar propriedades do primeiro nível. Ele é raso: objetos aninhados continuam editáveis. E em módulo ES a tentativa de escrever num objeto congelado lança TypeError, enquanto em script sem modo estrito ela falha em silêncio.
Spread copia o objeto inteiro?
Copia só o primeiro nível. Se uma propriedade guarda outro objeto, a cópia recebe a mesma referência — mexer nela muda o original. Para cópia independente de estrutura aninhada, use structuredClone, que já vem no Node e nos navegadores atuais.

Dúvidas e comentários

Travou em algum passo? Pergunte aqui — a equipe e outros alunos respondem.

Todo o código deste artigo foi executado em Node 24.16.0, e as saídas exibidas são as reais — como produzimos este conteúdo.

Fontes consultadas

  1. MDN — Trabalhando com objetos — developer.mozilla.org
  2. MDN — Inicializador de objeto — developer.mozilla.org
  3. MDN — delete — developer.mozilla.org

Continue por aqui