为传递给函数的数组赋值

and*_*rey 6 javascript arrays function

var arrN = [1, 2, 3];

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

init(arrN);
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激!

tri*_*cot 2

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

(重新)分配

当你做这样的作业时:

arr = []; // or any other value
Run Code Online (Sandbox Code Playgroud)

arr...那么之前的值就不会改变。只是arr与之前的值分离并引用一个新值。原始值(如果它是一个对象)仍然存在,但arr不再可以访问它。

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

变异

如果您不为 赋值arr,而是对其应用突变,例如使用splicepushpop或对其属性之一进行赋值(如arr[0] = 1或 ) ,那就是另一回事了arr[1]++。在这些情况下,arr保持引用同一对象,并且对其引用的对象进行更改,这对于引用同一对象的任何其他变量都是arrN可见的,例如.

清除数组

现在,如果您想清除传递给函数的数组,则必须避免进行类似的赋值arr = ...。相反,使用就地改变数组的方法:

arr.splice(0)
Run Code Online (Sandbox Code Playgroud)

或者,另一种选择:

arr.length = 0;
Run Code Online (Sandbox Code Playgroud)

现在你实际上已经改变了数组,这也是 引用的数组arrN