Primeiro, vamos definir o que são tipos primitivos.
Tipos primitivos em JavaScript são
- strings
- numbers (Number and BigInt)
- booleans (true or false)
- undefined
- Symbol values
null é um tipo primitivo especial. Se você executar typeof null, receberá 'object' de volta, mas na verdade é um tipo primitivo.
Tudo o que não é um tipo primitivo é um objeto.
Funções também são objetos. Podemos definir propriedades e métodos em funções. typeof retornará 'function', mas o construtor Function deriva do construtor Object.
As grandes diferenças entre tipos e objetos primitivos são
- tipos primitivos são imutáveis, os objetos têm apenas uma referência imutável, mas seu valor pode mudar com o tempo
- tipos primitivos são passados por valor. Objetos são passados por referência
- tipos primitivos são copiados por valor. Objetos são copiados por referência
tipos primitivos são comparados por valor. Objetos são comparados por referência
Se copiarmos um tipo primitivo desta maneira:
let name = 'Flavio'
deixe secondName = name
Agora podemos alterar a variável name, atribuindo-lhe um novo valor, mas secondName ainda mantém o valor antigo, porque foi copiado por valor:
name = 'Roger'
secondName // 'Flavio'
Se tivermos um objeto:
deixe carro = {
cor amarela'
}
e copiamos para outra variável:
let carro = {
cor amarela'
}
let outroCar = carro
nesse caso, otherCar aponta para o mesmo objeto que car. Se você definir
car.color = 'azul'
Além disso
anotherCar.color
será 'azul'.
O mesmo funciona para passar objetos para funções e comparar.
Digamos que queremos comparar um carro com outro
anotherCar === carro // verdadeiro
Isso é verdade porque ambas as variáveis apontam exatamente para o mesmo objeto.
Mas se anotherCar fosse um objeto com as mesmas propriedades que carro, compará-los daria um resultado falso:
let carro = {
cor amarela'
}
let anotherCar = {
cor amarela'
}
anotherCar === carro // falso