为什么我的函数在修改数组时修改参数?
这个问题在这里已经有了答案:
对象(包括数组)在ECMAScript中通过引用进行分配。 因此,当您在函数中修改数组时,您正在修改与传入函数相同的数组,而不是数组的新副本。
一个快速的方法来执行一个数组的浅拷贝是使用slice(0)
(并在一些现代的引擎,你可以省略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
在函数2和函数3中,您正在修改输入变量(通过更改其内容)。
在函数1中,你不会修改输入变量; 你只是将它指定为指向其他的=
。
对象(包括数组)通过引用传递 - 如果您不想修改输入,最安全的方法是在函数的开头复制输入(在可能修改它之前)。 对于数组,您可以使用slice
函数执行此操作: var copy = input.slice(0)
上一篇: Why does my function change the argument when it modifies an array?