Armazenamento por valor vs Armazenamento por referência em Javascript

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, nulle 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, Errore 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