No entiendo por qué asignar la matriz a un nuevo valor no afecta a la nueva matriz. Sé que "push" modifica la matriz original, el empalme también y el filtro o el corte no, esta no es mi pregunta. mi pregunta es por qué la asignación no lo hace. He revisado viejas preguntas y respuestas diciendo que se pasa por referencia, pero de nuevo si se pasa por referencia, entonces cambiar su valor también debería afectar la referencia.

const modify = (someArray) => {
    // modified my array
    someArray.push(1)
    // modified my original array
    someArray[0] = 'A'

    // didn't modify my array and I want to know why.
    someArray = ['whatever']
}
let myArray = ['a', 'b']
modify(myArray)
console.log(myArray) //  ["A", "b", 1]
3
JS Lover 30 oct. 2019 a las 13:38

3 respuestas

La mejor respuesta

Como he descrito esto a los principiantes muchas veces, he descubierto que es mejor pensar que los objetos en Javascript se pasan y se asignan como un puntero (como en la forma en que funcionan los punteros en C / C ++). Entonces, cuando haces esto:

let a = [1,2,3];
let b = a;

Ahora tiene dos variables que tienen un puntero a la misma matriz [1,2,3]. Creo que funciona mejor pensar en la matriz existente por sí misma y ahora tiene dos variables que cada punto apunta a esa matriz. Cuando asigna b = a, no hace una copia de los datos, solo apunta b a los mismos datos que a apuntaba.

Si modifica esa matriz con algo como a.push(4) o asignando como a[0] = 9, entonces la única y única matriz a la que apuntan a y b se ha modificado. Entonces, ya sea que acceda a esa matriz desde a o desde b, verá el cambio porque ambas variables apuntan al mismo objeto de matriz física.

Pero, si reasigna alguna otra matriz a b como esta:

b = [9,8,7];

Acaba de tomar una nueva matriz y ponerle un puntero en b. La otra variable a todavía apunta a la misma matriz original a la que está acostumbrado. No ha sido cambiado de ninguna manera.

Cuando pasa una matriz como un argumento como lo está haciendo en su función modify(), el argumento de la función en la función es como la variable b en el ejemplo anterior. Es solo otra variable que apunta a la misma matriz. Si modifica la matriz en sí, ambas variables apuntarán a la misma matriz modificada. Pero, si reasigna la variable de argumento para que ahora apunte a otra matriz, solo esa variable se verá afectada.

1
jfriend00 30 oct. 2019 a las 19:08

['a', 'b'] es una matriz. myArray es una variable que se refiere a esa matriz. someArray es una variable local a la función modify que tomará el valor de myArray (es decir, la referencia a su matriz; por lo tanto, myArray y someArray se refieren a la misma matriz). Como notó, someArray.push(1) y someArray[0] = 'A' ambos modifican la matriz mencionada por someArray. someArray = ["whatever"] cambiará la referencia de someArray a la nueva matriz ['whatever'], pero myArray todavía se refiere a la matriz anterior. Al final de la función, la variable someArray desaparece (y ['whatever'] se olvida, ya que ya nada se refiere a eso).

No hay forma en JavaScript de cambiar la referencia de la variable pasada a una función (como, por ejemplo, la lata de C ++); solo puede manipular los puntos de referencia recibidos.

1
Amadan 30 oct. 2019 a las 10:44

¡En Javascript (y Java o C #) todo se pasa por defecto por valor !

Lo importante es saber cuál es el valor. Esta línea let myArray = ['a', 'b'] crea una nueva matriz en la memoria y coloca la referencia en myArray. Ahora, el valor de myArray es la referencia a la memoria donde reside ['a', 'b'].

Cuando lo pasa a la función modify, el valor, que es la referencia, se copia de myArray a someArray. Significa que someArray puede acceder al mismo segmento de memoria de la misma matriz, por lo tanto, cambie los valores dentro de esa matriz, pero no puede cambiar el valor de myArray (que es la referencia a esa matriz) de {{ X5}}.

3
libik 30 oct. 2019 a las 15:31