¿Es posible en Javascript pasar una matriz (desde el alcance externo) a una función y mutar la matriz original?
He leído varias respuestas que mencionan que el argumento arr de f() es en realidad una copia, su nombre solo sombrea la variable de alcance externo. Otras matrices de mención siempre se pasan por referencia, pero se 'copian' (esa es una explicación confusa).
Pero si ese es el caso, ¿por qué arr[0] = 'a'; encontrar la referencia arr en el alcance externo? ¿Pero arr = ['a', 'b'] no?
Si arr = ['a', 'b'] se declaró en la función con un tipo var de ámbito de bloque ( let , const ), eso tendría más sentido.
let a = [0,0,1,1,1,2,2,3,3,4]; function f(arr, z) { arr[0] = 'a'; arr = ['a', 'b'] } f(a); console.log(a); [ 'a', 0, 1, 1, 1, 2, 2, 3, 3, 4 ] Desde dentro de la función f() , la línea arr[0] = 'a' modifica arr en el ámbito externo
Pero la referencia arr = (without a let or const`) también debería referirse al ámbito externo.
Lo primero es que las matrices siempre se pasan como referencia en javascript.
Ahora, en cuanto a su pregunta, cuando se pasa una matriz a una función, la variable de argumento de esa función contendrá esa referencia, en su caso es el argumento arr. Si muta arr, mutará la matriz original ya que se refiere a la matriz original, pero si solo asigna algún otro valor o referencia a arr, ya no mantendrá la referencia a esa matriz original y cualquier cambio en la nueva referencia no tendrá ningún efecto. en esa matriz.
JavaScript se pasa por valor. Sin embargo, al pasar un objeto como parámetro, el valor es la referencia.
Una matriz es un objeto. Al modificar la propiedad de un objeto, el cambio se reflejará incluso fuera del alcance de la función. Así, la modificación de un elemento (por ejemplo, una propiedad de la matriz) produce dicho efecto. Sin embargo, reemplazar el objeto solo reemplazará el valor al que apunta dicha referencia, por lo que el cambio solo se reflejará dentro del alcance de la función.