Os valores primitivos são armazenados por valor, enquanto os objetos são armazenados por referência. Os principais valores primitivos são Number
, Boolean
, String
, null
e undefined
(as pessoas vão discutir os dois últimos são, na verdade, valores, mas eles seguem as mesmas regras de armazenamento de memória quando comparado com os valores primitivos). Os valores de “complexos” (como de ECMAScript 262 Ed. 3) são Object
, Array
, Function
, Date
, Error
e RegExp
. Aqui está um exemplo:
var a = 10
var b = a
a // returns 10
b // returns 10
a = 20
a // returns 20
b // returns 10
em contraste com
var a = {}
var b = a
a // returns {}
b // returns {}
a.foo = "bar"
a // returns {foo: "bar"}
b // returns {foo: "bar"}
Como um bom exercício, comparar objetos complexos é feito por referência, não por valor. Isso significa que você está realmente comparando o endereço de memória em que eles estão sendo armazenados
var a = { foo: "bar" }
var b = { foo: "bar" }
a === b // returns false
b = a
a === b // returns true