W3docs

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):

javascript— editable

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:

javascript— editable

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ênciaobjects 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:

  1. Cria um wrapper object temporário do tipo correspondente que contém o valor primitivo.
  2. Lê o método ou propriedade solicitado a partir desse wrapper.
  3. Executa-o e retorna o resultado.
  4. 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:

javascript— editable

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:

javascript— editable

Dois pontos a observar. Primeiro, toFixed() retorna uma string, não um numbertypeof (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():

javascript— editable

Métodos de Symbol

Symbols, um tipo primitivo único, obtêm métodos do wrapper Symbol:

javascript— editable

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:

javascript— editable

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:

javascript— editable

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, Symbol e BigInt fornecem os métodos; null e undefined não têm wrapper e lançam erro ao acessar uma propriedade.
  • Use funções wrapper sem new para conversão de tipo. Nunca use new para 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.

Prática

Prática
Quais dos seguintes métodos são aplicáveis a tipos de dados primitivos em JavaScript?
Quais dos seguintes métodos são aplicáveis a tipos de dados primitivos em JavaScript?
Was this page helpful?