He estado leyendo sobre pasar por valor vs pasar por referencia en javascript y leí que JavaScript siempre pasa por valor, solo con tipos no primitivos, el valor es una dirección en la memoria. Pero, ¿no es este el caso también con los tipos primitivos? ¿Los tipos primitivos no se almacenan también en la memoria y las variables asignadas a ellos también deben señalar su ubicación? Usaré esta tabla para tratar de explicar lo que estoy diciendo.
| Variable | Dirección | Valor |
|---|---|---|
| a | 0x01 | 10 |
| b | 0x02 | 10 |
| C | 0x03 | [1, 2] |
| d | 0x03 | [1, 2] |
Cuando la variable 'b' se asigna al valor de 'a' (b=a), el valor en la dirección de 'a' (10) se copia y esta copia se coloca en una ubicación diferente en la memoria con la nueva dirección siendo asignado a 'b'?
Cuando d = c, en lugar de hacer una copia del valor en la dirección de 'c', a la variable d se le da la misma dirección que c; ahora ambas apuntan a la misma ubicación en la memoria que almacena la matriz [1, 2 ]?
¿La tabla es exacta o...?
Gracias.
Cuando declara variables, el motor de JavaScript les asigna la memoria en dos ubicaciones de memoria: stack y heap .
Los datos estáticos son los datos cuyo tamaño se fija en el momento de la compilación. Los datos estáticos incluyen:
Debido a que los datos estáticos tienen un tamaño que no cambia, el motor de JavaScript asigna una cantidad fija de espacio de memoria a los datos estáticos y los almacena en la pila.
Por ejemplo, lo siguiente declara dos variables e inicializa sus valores en una cadena literal y un número:
let name = 'John'; let age = 25; Debido a que el nombre y la edad son valores primitivos, el motor de JavaScript almacena estas variables en la pila, como se muestra en la siguiente imagen: 
A diferencia de la pila, JavaScript almacena objetos (y funciones) en el montón. El motor de JavaScript no asigna una cantidad fija de memoria para estos objetos. En cambio, asignará más espacio según sea necesario.
El siguiente ejemplo define las variables de nombre, edad y persona:
let name = 'John'; let age = 25; let person = { name: 'John', age: 25, };En esta imagen, JavaScript asigna memoria en la pila para las tres variables nombre, edad y persona.
El motor de JavaScript crea un nuevo objeto en la memoria del montón. Además, vincula la variable persona en la memoria de la pila con el objeto en la memoria del montón.
Por eso decimos que la variable persona es una referencia que se refiere a un objeto.