为传递给函数的数组赋值

时间:2017-02-26 15:19:52

标签: javascript arrays function

var arrN = [1, 2, 3];

function init(arr){
   arr = [];
   console.log(arrN) //output [1, 2, 3], expect []  
}

init(arrN);

使用splicepush方法时,正在修改传递给函数的数组。所以我试图了解使用赋值运算符时发生了什么,为什么它不更改数组?它是否创建了传递数组的本地var

任何帮助将不胜感激!

4 个答案:

答案 0 :(得分:3)

您需要区分变量和实际对象(数组)。 splicepush正在更改对象。 arr = []只是更改变量,旧对象保持原样。

答案 1 :(得分:2)

将不同的对象分配给变量或改变当前由变量引用的对象是有区别的。

(Re)的分配

当您执行以下任务时:

arr = []; // or any other value

...然后arr先前的值不会改变。只是arr与之前的值分离并引用了一个新值。原始值(如果它是一个对象)继续存在,但arr无法再访问它。

附注:如果没有其他变量再引用前一个值,垃圾收集器将在某个时间点释放它使用的内存。但这不是你的情况,因为全局变量arrN仍然引用原始值。

不同诱变

如果您没有为arr分配值,而是将变种应用于其中,例如使用splice,{{ 1}},push或对其中一个属性的分配,例如poparr[0] = 1。在这些情况下,arr[1]++不断引用同一个对象,并对其引用的对象进行更改, 对引用同一对象的任何其他变量可见,如{{1 }}。

清除数组

现在,如果要清除传递给函数的数组,则必须避免进行arr之类的赋值。相反,使用改变数组的方法:

arrN

或者,或者:

arr = ...

现在你实际上已经改变了数组,这也是arr.splice(0) 引用的数组。

答案 2 :(得分:2)

在JavaScript中,特别是在处理对象时,赋值运算符(=)有三个作业。

  1. 分配
  2. 如果右侧是对象,则创建新引用。
  3. 如果双方都是对象,则中断任何先前的引用并创建多个分配。
  4. 如;

    var a = [1,2,3],   // a is assigned an array
        b = a;         // b is assigned just a reference to a
    a = ["a","b","c"]; // b to a referral is now broken
                       // a is assigned with ["a","b","c"]
                       // b is assigned with [1,2,3]
    

    如果以相反的顺序完成,则同样适用;

    var a = [1,2,3],   // a is assigned an array
        b = a;         // b is assigned just a reference to a
    b = ["a","b","c"]; // b to a referral is now broken
                       // b is assigned with ["a","b","c"]
                       // a keeps it's existing assignment as [1,2,3]
    

答案 3 :(得分:1)

您正在将arrN传递给控制台,而不是传递arr。此外,您只需按名称调用函数,而不是通过关键字function调用。这是更正后的代码:

var arrN = [1, 2, 3];

function init(arr){
   arr = [];
   console.log(arr) 
}

init(arr);

您还使用参数init()声明arr,在这种情况下不需要。您传递给init()的价值是什么,arr的值将是[],因为您在函数中重新分配它。