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