JavaScript tiene dos tipos de datos. Datos primitivos (cadena, número, booleano) y objetos. Los datos primitivos son inmutables (no se pueden cambiar) y generalmente ocupan menos memoria. Los objetos, por otro lado, pueden ser triviales o masivos y son mutables.
Cada vez que declara una variable en JavaScript, se reserva un lugar en la memoria para contener un valor. Ese lugar en la memoria tiene un nombre, que es el nombre de la variable (por ejemplo: var strawhat) y también una dirección (algún número aleatorio, que no es tan importante en este momento). Cuando asigna un valor a la variable (por ejemplo: strawhat = “luffy”;) el valor se copia en esa memoria reservada solo si es de tipo primitivo. Si se trata de un objeto, el valor se almacena en algún lugar de la memoria y la dirección (a menudo denominada referencia) se copia en la variable. Ahora esta variable puede pasarse a cualquier función o copiarse en otra variable.
Los datos primitivos se pasan por valor. Por ejemplo, cuando copia una variable en otra, el valor real de la primera variable se copia en la segunda variable.
- ¿Qué lenguajes de programación debo aprender para hacer un sitio web similar a eBay?
- ¿Angular 2.0 tendrá alguna de las capacidades DI de Angular 1.0?
- ¿Qué debe saber un desarrollador de Node.js sobre las funciones principales de Node.js?
- ¿Cómo debería un desarrollador del lado del servidor comenzar a actualizar sus habilidades de IU web?
- ¿Qué lenguaje de programación es el más difícil de hackear (el más seguro) y qué método podría usarse para agregar protección adicional a mi página web y a mi aplicación para que no sea hackeada?
Veamos un ejemplo.
// Declarando una variable que reserva un lugar en la memoria.
var paja;
// Asignación de valor a la variable.
strawhat = “luffy”;
Ahora pasemos el valor de esta variable a otra variable.
var mugiwara = sombrero de paja;
Al hacerlo, se copia el valor “luffy” en mugiwara. Y dado que los datos primitivos son inmutables, cambiar uno no afecta al otro. Ahora si cambiamos la variable mugiwara …
mugiwara = “vástagos”;
… e imprime ambas variables, mugiwara debería imprimir “vástagos” y paja debería imprimir “luffy”.
console.log (mugiwara); // imprime “vástagos”
console.log (sombrero de paja); // imprime “luffy”
Ahora, finalmente, veamos la respuesta a su pregunta.
A diferencia de los datos primitivos, los objetos se pasan por referencia. Lo que esto significa es que, cuando pasa un objeto (lo copia a otra variable o lo envía a una función), en realidad está pasando la dirección (que ha almacenado en la variable) y no el objeto completo.
Otro ejemplo.
var obj = {zoro: “espadas”, sanji: “cocinero”};
Lo que hace la declaración anterior es almacenar el objeto a la derecha en la memoria en algún lugar y asignar la dirección (referencia) a la variable obj. Y ahora si copia el obj a otra variable …
var newObj = obj;
… en realidad está copiando la dirección a la nueva variable newObj. Como ambos apuntan al mismo objeto, la modificación de un objeto modificará el otro objeto.
newObj.zoro = “katana”;
console.log (newObj.zoro); // imprime “katana”
console.log (obj.zoro); // imprime “katana”
Y esto es lo que significa “Los objetos se pasan por referencia”.