我不希望foo在这个例子中完全改变,但当我在函数中将其修改为数组时,它会改变参数。注意foo没有被function1改变...我猜是因为它没有直接修改参数???任何避免这种情况的帮助都将非常感激。
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
答案 0 :(得分:1)
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 :(得分:1)
在function2和function3中,您正在修改输入变量(通过更改其内容)。
在function1中,你没有修改输入变量;你只是用=
指定它来指向其他东西。
对象(包括数组)通过引用传递 - 如果您不想修改输入,最安全的做法是在函数开头复制输入(在可能修改它之前)。对于数组,您可以使用slice
函数执行此操作:var copy = input.slice(0)
答案 2 :(得分:1)
对象,包括数组,在ECMAScript中通过引用分配。因此,当您修改函数中的数组时,您正在修改传递给函数的相同数组,而不是数组的新副本。
执行数组浅表副本的快速方法是使用slice(0)
(在某些现代引擎中,您可以省略0
)。有关复制数组的信息,请参阅this answer。
有关示例,请参阅this answer。
答案 3 :(得分:0)
将数组传递给函数时,它会通过引用传递。在function2和function3中,您正在修改foo
数组。在function1中,newFoo
将包含一个数组,其中第一项为foo
,然后是值a和1.