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

时间:2014-01-14 16:54:42

标签: javascript

我不希望foo在这个例子中完全改变,但当我在函数中将其修改为数组时,它会改变参数。注意foo没有被function1改变...我猜是因为它没有直接修改参数???任何避免这种情况的帮助都将非常感激。

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

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.