Oi Alison! Estou de volta. Para ficar ainda mais claro o motivo de usarem o termo primitivo e não esta errado (apesar do ideal é o uso do termo literal).
O tipos que começam em minúsculo equivalem a declaração literal. Vejamos um exemplo:
let nome = 'Flávio';
let idade = 20.;
Até segunda ordem, guardam um primitivo em memória. O que é um tipo primitivo. Aquele que só guarda dado e não tem comportamento nenhum.
Mas se chamarmos um método em nome
e em idade
, vai funcionar:
let nome = 'Flávio';
nome = nome.replace(/vio/, 'vião');
let idade = 20.10;
let idadeParaString = idade.toFixed(2);
Se são primitivos, como podemos chamar métodos? Congela aqui, agora vamos para outra explicação.
JavaScript permite criar strings e números não como literais, mas como objetos:
let nome = new String('Flávio');
console.log(typeof(nome)); // Object
let idade = new Number(20);
console.log(typeof(idade)); // Object
Esses possuem método e se comportam como nossos literais. Mas qual a diferença?
Os tipos string
e number
são literais e guardam um valor primitivo. Contudo, se tentarmos chamar algum método em variáveis declaradas com esses tipos, eles são empacotados automaticamente (auto-boxing) por String
e Number
respectivamente.
É por isso que esse código funciona:
let nome = 'Flávio';
nome.replace('/vio/', 'vião'); // faz auto-boxing, por debaixo dos panos faz algo como new String('Flávio');
Então, na prática, usamos a declaração literal porque é mais fácil e rápida, mas o JavaScript se encarrega em promover os primitivos para seu respectivo tipo objeto.
Acho que com isso mata a charada toda.
Há um detalhe sutil ainda nos dois tipos. Se fizemos:
let nome = 'Flávio';
Não conseguimos adicionar propriedades dinamicamente em nome
, mesmo se ele sofrer autoboxing.
let nome = 'Flávio'
nome.teste = 10;
console.log(nome.teste); // undefined
Mas se criarmos com new String()
podemos:
let nome = new String('Flávio');
nome.teste = 10;
console.log(nome.teste)// imprime 10!
Sucesso bom estudo.