Javascript 为什么我的函数在修改数组时会更改参数?

Javascript 为什么我的函数在修改数组时会更改参数?,javascript,Javascript,在本例中,我不希望foo发生任何更改,但当我将其作为函数中的数组修改时,它会更改参数。注意foo并没有被function1改变…我猜是因为它没有直接修改参数???任何避免这种情况的帮助都将不胜感激 将数组传递给函数时,它按引用传递。在function2和function3中,您都在修改foo数组。在函数1中,newFoo将由一个数组组成,第一项是foo,然后是值a和1。在函数2和函数3中,您正在修改输入变量(通过更改其内容) var foo = [1,2,3]; bar = function

在本例中,我不希望foo发生任何更改,但当我将其作为函数中的数组修改时,它会更改参数。注意foo并没有被function1改变…我猜是因为它没有直接修改参数???任何避免这种情况的帮助都将不胜感激


将数组传递给函数时,它按引用传递。在function2和function3中,您都在修改
foo
数组。在函数1中,
newFoo
将由一个数组组成,第一项是
foo
,然后是值a和1。

在函数2和函数3中,您正在修改输入变量(通过更改其内容)

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
在函数1中,您没有修改输入变量;您只是将其指定为使用
=
指向其他对象


对象(包括数组)是通过引用传递的-如果您不想修改输入,最安全的做法是在函数的开头复制输入(在可能修改它之前)。对于数组,可以使用
slice
函数执行此操作:
var copy=input。slice(0)
对象(包括数组)在ECMAScript中通过引用分配。因此,当您在函数中修改数组时,您是在修改传入函数的相同数组,而不是数组的新副本

一种快速执行数组浅拷贝的方法是使用(在一些现代引擎中,您可以省去
0
)。请参见关于复制数组

另请参见以获取一些示例

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