devterview_$ iniciar simulação

Cópia rasa: spread, Object.assign e o objeto aninhado

MédioPlenoFundamentos da linguagem

Pergunta

Por que `const copia = { ...original }` não protege objetos aninhados de mutação, e quais as opções pra cópia profunda?

Resposta esperada

Spread e `Object.assign` fazem cópia RASA: as propriedades de primeiro nível são copiadas, mas se um valor é um objeto/array, a cópia guarda a MESMA referência que o original. Então `copia.endereco.cidade = 'X'` altera `original.endereco.cidade` também. Opções pra cópia profunda: `structuredClone(obj)` (nativo, moderno, lida com Map/Set/Date/circular, mas não com funções nem DOM nodes); `JSON.parse(JSON.stringify(obj))` (rápido de escrever mas perde `undefined`, funções, `Date` vira string, quebra com circular e `BigInt`); libs (`lodash.cloneDeep`); ou, o mais idiomático em fluxos imutáveis, não clonar tudo — recriar só o caminho que muda (`{ ...obj, endereco: { ...obj.endereco, cidade: 'X' } }`) ou usar Immer.

Por que perguntam isso

Pergunta pleno de JS. Sinal de domínio: `structuredClone` e as perdas do JSON round-trip; bônus: 'recriar só o caminho' pra state imutável.

#shallow-copy#deep-copy#structuredclone#spread
publicidade

Relacionadas