"A propriedade desapareceu, mas o objeto permaneceu": como remover o que não é necessário em JavaScript?
\n\nImagine a situação: você está trabalhando com um objeto grande que veio do servidor. Ele tem 20 campos, mas para enviar o formulário, você precisa apenas de 15. Ou você está escrevendo uma função que deve retornar dados sem o campo de serviço _id. O que fazer? A pergunta mais popular no Stack Overflow sobre este tópico tem centenas de milhares de visualizações — e não é por acaso.
Remover uma propriedade de um objeto é uma daquelas tarefas que parecem triviais, mas escondem algumas surpresas. Neste artigo, vamos analisar todas as principais maneiras de remover uma propriedade de um objeto em JavaScript, comparar seu desempenho e mutabilidade, e descobrir qual abordagem escolher em 2025.
\n\nMétodo nº 1: Operador delete — o clássico
\n\nA maneira mais óbvia e historicamente a primeira é usar o operador delete. Ele remove a propriedade do objeto de forma definitiva e irreversível.
const user = {\n name: 'Ana',\n email: 'ana@example.com',\n password: 'super_secret_123'\n};\n\ndelete user.password;\n\nconsole.log(user);\n// { name: 'Ana', email: 'ana@example.com' }\nconsole.log(user.password); // undefined\n\n\nComo o delete realmente funciona?
\n\nO operador delete não apenas atribui undefined. Ele remove completamente a propriedade do objeto. Você pode verificar isso usando o método hasOwnProperty:
const car = { brand: 'Tesla' };\nconsole.log(car.hasOwnProperty('brand')); // true\n\ndelete car.brand;\nconsole.log(car.hasOwnProperty('brand')); // false\n\n\nUma diferença importante: após o delete, a propriedade deixa de existir. Durante a iteração com for...in ou Object.keys(), ela não aparecerá.
Quando o delete não funciona?
\n\nExistem algumas "armadilhas":
\n\n- \n
- Não é possível remover propriedades declaradas com var/let/const. O operador
deletefunciona apenas com propriedades de objetos. \n - Propriedades herdadas do protótipo não são removidas — apenas as próprias. \n
- Propriedades com a flag configurable: false (por exemplo, de objetos nativos) não são removidas. No modo estrito, isso causará um erro. \n
// Exemplo: propriedade com configurable: false\nconst obj = {};\nObject.defineProperty(obj, 'fixed', {\n value: 42,\n configurable: false\n});\n\ndelete obj.fixed; // false (não foi removida)\nconsole.log(obj.fixed); // 42\n\n\nMétodo nº 2: Desestruturação e operador rest — abordagem moderna
\n\nSe você trabalha com dados imutáveis (e no JavaScript moderno isso é considerado uma boa prática), o delete pode não ser a melhor escolha — ele muta o objeto original. A alternativa é criar um novo objeto sem a propriedade indesejada usando desestruturação:
const user = {\n name: 'João',\n email: 'joao@example.com',\n role: 'admin',\n token: 'abc123'\n};\n\n// Removendo o campo token, criando um novo objeto\nconst { token, ...userWithoutToken } = user;\n\nconsole.log(userWithoutToken);\n// { name: 'João', email: 'joao@example.com', role: 'admin' }\nconsole.log(user.token); // 'abc123' — objeto original não foi alterado!\n\n\nEsta abordagem é especialmente popular no desenvolvimento React, quando você precisa passar apenas parte das props para um componente, excluindo campos de serviço.
\n\nPrós e contras da desestruturação
\n\n- \n
- + Imutabilidade: o objeto original permanece inalterado. Isso é importante para Redux, Vuex e programação funcional. \n
- + Legibilidade: fica claro quais campos estamos excluindo. \n
- - Desempenho: uma cópia do objeto é criada, o que para objetos grandes pode ser custoso. \n
- - Inconveniente para remover muitas propriedades: se você precisa remover 5 campos de 20,