¿Por qué mi función cambia el argumento cuando modifica una matriz?

No esperaría que foo cambiara en absoluto en este ejemplo, pero cuando lo modifico como una matriz en la función, cambia el argumento. Note que foo no es cambiado por function1 … Supongo que porque no modifica el argumento directamente ??? Cualquier ayuda para evitar esto sería muy apreciada.

http://jsfiddle.net/t47kD/

var foo = [1,2,3]; bar = function1(foo); bar = function2(foo); bar = function3(foo); function function1(newFoo){ newFoo = [newFoo,'a',1]; return newFoo; } //foo after function1 = 1,2,3 function function2(newFoo){ newFoo[0] = 'a'; return newFoo; } //foo after function2 = a,2,3 function function3(newFoo){ newFoo.push('4'); return newFoo; } //foo after function3 = a,2,3,4 

Los objetos, incluidas las matrices, se asignan por referencia en ECMAScript. Por lo tanto, cuando modifica la matriz en la función, está modificando la misma matriz que pasó a la función, no una copia nueva de la matriz.

Una forma rápida de realizar una copia superficial de una matriz es usar slice(0) (y en algunos motores modernos puede omitir el 0 ). Vea esta respuesta acerca de copiar una matriz.

También vea esta respuesta para algunos ejemplos.

 var foo = [1,2,3]; bar = function1(foo); bar = function2(foo); bar = function3(foo); function function1(newFoo){ return [newFoo,'a',1]; } //foo after function1 = 1,2,3 function function2(newFoo){ var otherFoo = newFoo.slice(0); otherFoo[0] = 'a'; return otherFoo; } //foo after function2 = 1,2,3 function function3(newFoo){ var otherFoo = newFoo.slice(0); otherFoo.push('4'); return otherFoo; } //foo after function2 = 1,2,3 

En function2 y function3, estás modificando la variable de entrada (cambiando su contenido).

En la función 1, no estás modificando la variable de entrada; simplemente lo estás asignando para que apunte a otra cosa con = .

Los objetos (incluidas las matrices) se pasan por referencia: si no desea modificar la entrada, lo más seguro es hacer una copia de la entrada al principio de la función (antes de modificarla potencialmente). Para los arreglos, puede hacer esto con la función de var copy = input.slice(0) : var copy = input.slice(0)

Cuando se pasa una matriz a una función, pasa por referencia. Tanto en function2 como en function3, estás modificando la matriz foo . En function1, newFoo consistiría en una matriz con el primer elemento siendo foo , luego los valores newFoo 1.