Métodos de Primitivos em JavaScript
Aprenda como primitivos JavaScript como strings, números, booleans, symbols e bigints chamam métodos por meio de wrappers de object temporários, com exemplos executáveis e armadilhas comuns.
Introdução aos Primitivos e Objects em JavaScript
Em JavaScript, quase tudo que você escreve envolve um primitivo ou um object. Compreender a diferença — e o truque inteligente que permite que primitivos se comportem como objects — é um dos fundamentos da linguagem.
Um primitivo é o tipo de valor mais simples e indivisível. Existem sete tipos primitivos: numbers, strings, booleans, undefined, null, symbols e bigints. Um object é uma coleção de propriedades e métodos.
Aqui está o enigma que esta página resolve: uma string é um primitivo sem métodos, ainda assim "hello".toUpperCase() funciona. Como um valor sem métodos pode chamar um método? A resposta são os wrappers de object, e este capítulo explica exatamente como eles funcionam.
Esta página aborda o que torna os primitivos especiais, como JavaScript os envolve temporariamente para que você possa chamar métodos, os métodos disponíveis para cada tipo primitivo e o erro comum de usar new com um construtor de primitivo.
O Que Torna os Primitivos Únicos
Os primitivos diferem dos objects de três maneiras importantes.
1. Imutabilidade. Uma vez criado um valor primitivo, ele não pode ser alterado. Uma operação em string nunca edita a string original no lugar — ela retorna uma string completamente nova. Tentar atribuir a um caractere não faz nada (e lança um erro no modo estrito):
2. Armazenados por valor. Um primitivo é mantido diretamente na variável. Quando você o copia, você copia o próprio valor, então as duas variáveis são totalmente independentes:
Objects, ao contrário, são armazenados por referência — copiar a variável copia apenas um ponteiro para o mesmo object.
3. Simples e leves. Um primitivo não carrega propriedades ou métodos próprios, o que o torna rápido de criar e comparar. Um boolean como let flag = true; é apenas um valor, sem nenhuma sobrecarga que um object teria.
Objects em JavaScript: Um Contraste
Objects são a estrutura mais complexa. Ao contrário dos primitivos, eles são:
- Mutáveis — seu conteúdo pode ser alterado após a criação.
- Tipos de referência — objects são armazenados e copiados por referência, não por valor.
- Versáteis — podem conter funções, arrays e outros objects.
Como os Primitivos Chamam Métodos: Wrappers de Object
Então como "hello".toUpperCase() funciona se a string não tem métodos? Quando você acessa uma propriedade ou método em um primitivo, JavaScript:
- Cria um wrapper object temporário do tipo correspondente que contém o valor primitivo.
- Lê o método ou propriedade solicitado a partir desse wrapper.
- Executa-o e retorna o resultado.
- Descarta o wrapper object imediatamente.
Todo esse processo acontece nos bastidores e é fortemente otimizado pelo motor, sendo efetivamente gratuito. A principal conclusão: o primitivo em si nunca é alterado e nunca se torna permanentemente um object — o wrapper existe apenas durante a duração daquela única expressão.
Os Construtores de Wrapper
Cinco tipos primitivos têm um construtor de wrapper embutido correspondente que fornece seus métodos:
- String — para primitivos string.
- Number — para valores numéricos.
- Boolean — para valores boolean.
- Symbol — para symbols.
- BigInt — para bigints.
null e undefined não têm wrapper, portanto acessar uma propriedade neles lança um TypeError (por exemplo, null.toString() falha).
Métodos de String
Strings expõem um conjunto rico de métodos por meio do wrapper String. Aqui alguns deles se combinam para colocar uma frase em formato de título:
Observe que length é uma propriedade, não um método, portanto não tem parênteses. toUpperCase() retorna uma nova string e deixa greeting intocada, fiel à regra de imutabilidade acima.
Métodos de Number
Numbers ganham métodos do wrapper Number. Um frequente é toFixed(), que arredonda para um número fixo de casas decimais:
Dois pontos a observar. Primeiro, toFixed() retorna uma string, não um number — typeof (3.14159).toFixed(2) é "string". Segundo, para chamar um método diretamente em um literal numérico você precisa de parênteses extras ou um espaço: 255..toString(16) também funciona, mas 255.toString(16) é um erro de sintaxe porque o analisador lê o primeiro ponto como separador decimal.
Métodos de Boolean
Booleans podem usar o wrapper Boolean, mais frequentemente apenas toString():
Métodos de Symbol
Symbols, um tipo primitivo único, obtêm métodos do wrapper Symbol:
Você deve chamar toString() explicitamente aqui — symbols deliberadamente não se convertem automaticamente em string em contextos de string (como "" + sym), o que de outra forma lançaria um TypeError.
Métodos de BigInt
BigInt, projetado para inteiros muito grandes para o tipo Number regular, obtém métodos do wrapper BigInt:
O valor é passado como string aqui porque escrevê-lo como literal numérico excederia o intervalo seguro de inteiros e perderia precisão antes de BigInt sequer processá-lo.
A Armadilha: Nunca Use new com Wrappers de Primitivo
JavaScript permite que você construa um wrapper object com new Number(1), new String("x") ou new Boolean(false) — mas você quase nunca deveria fazer isso. Um wrapper criado com new é um object real, e todo object é verdadeiro (truthy), inclusive um que envolve false:
Esta é uma fonte clássica de bugs. Chamar o construtor sem new é válido e útil — Number("42"), String(123) e Boolean(value) realizam conversão de tipo simples e retornam primitivos, não objects.
Resumo
- Primitivos são valores simples e imutáveis armazenados por valor; objects são mutáveis e armazenados por referência.
- Chamar um método em um primitivo funciona porque JavaScript o envolve em um object temporário, executa o método e descarta o wrapper.
String,Number,Boolean,SymboleBigIntfornecem os métodos;nulleundefinednão têm wrapper e lançam erro ao acessar uma propriedade.- Use funções wrapper sem
newpara conversão de tipo. Nunca usenewpara criar wrapper objects no código do dia a dia — eles são sempre truthy e se comportam de forma inesperada.
A seguir, explore os métodos de cada tipo em profundidade em strings, numbers e bigint.