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

这个问题在这里已经有了答案:

  • JavaScript是传递引​​用还是传值语言? 29个答案

  • 对象(包括数组)在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)

    链接地址: http://www.djcxy.com/p/20815.html

    上一篇: Why does my function change the argument when it modifies an array?

    下一篇: Javascript passing by reference instead of value?