seção
Uma Nota sobre Terminologia
Antes de mergulhar, vamos esclarecer equívocos difundidos que até desenvolvedores experientes confundem.
Mito vs realidade
| Mito comum | A realidade |
|---|---|
| "Tipos por valor" vs "tipos por referência" | A ECMAScript só define primitivos e objetos |
| "Primitivos ficam na stack" | Específico da implementação — não está na spec |
| "Objetos ficam no heap" | Específico da implementação — não está na spec |
| "Primitivos são passados por valor" | JavaScript usa passagem por compartilhamento para TODOS os valores |
| "Objetos são passados por referência" | Objetos são passados por compartilhamento (você não pode reatribuir o original) |
O Que a ECMAScript Realmente Diz
A especificação ECMAScript (o padrão oficial do JavaScript) define exatamente duas categorias de valores:
| Termo ECMAScript | O que inclui |
|---|---|
| Valores primitivos | string, number, bigint, boolean, undefined, null, symbol |
| Objetos | Todo o resto (objetos literais, arrays, funções, dates, maps, sets, etc.) |
É isso. A spec nunca menciona "tipos por valor", "tipos por referência", "stack" ou "heap". São detalhes de implementação que variam conforme o engine JavaScript.
A distinção real: mutabilidade
A diferença fundamental entre primitivos e objetos é a mutabilidade:
- Primitivos são imutáveis — você não pode alterar um valor primitivo, apenas substituí-lo
- Objetos são mutáveis — você PODE alterar o conteúdo de um objeto
Essa distinção explica TODAS as diferenças de comportamento que você vai encontrar.