He escrito el siguiente JavaScript:
var myArray = ['a', 'b', 'c'];
var copyOfMyArray = myArray;
copyOfMyArray.splice(0, 1);
alert(myArray); // alerts ['b','c']
alert(copyOfMyArray); // alerts ['b','c']
var myNumber = 5;
var copyOfMyNumber = myNumber;
copyOfMyNumber = copyOfMyNumber - 1;
alert(myNumber); // alerts 5
alert(copyOfMyNumber); // alerts 4
Este código declara una variable myArray
y la establece en un valor de matriz. Luego declara una segunda variable copyOfMyArray
y la establece en myArray
. Realiza una operación en copyOfMyArray
y luego alerta a ambos myArray
y copyOfMyArray
. De alguna manera, cuando realizo una operación en copyOfMyArray
, parece que se realiza la misma operación en myArray
.
Luego, el código hace lo mismo con un valor numérico: declara una variable myNumber
y la establece en un valor numérico. Luego declara una segunda variable copyOfMyNumber
y la establece en myNumber
. Realiza una operación en copyOfMyNumber
y luego alerta a ambos myNumber
y copyOfMyNumber
. Aquí, obtengo el comportamiento esperado: diferentes valores para myNumber
y copyOfMyNumber
.
¿Cuál es la diferencia entre una matriz y un número en JavaScript que parece que cambiar una matriz cambia el valor de una copia de la matriz, mientras que cambiar un número no cambia el valor de una copia del número?
Supongo que, por alguna razón, se hace referencia a la matriz por referencia y al número por valor, pero ¿por qué? ¿Cómo puedo saber qué comportamiento esperar con otros objetos?
fuente
myArray.slice(0);
directamente en ese contexto?