var arrN = [1,2,3]; function init(arr){ arr = []; console.log(arrN) //output [1,3],expect [] } init(arrN);
使用splice或push方法时,正在修改传递给函数的数组.所以我试图理解使用赋值运算符时发生了什么,为什么它不改变数组呢?是创建传递数组的局部变量?
任何帮助将不胜感激!
解决方法
将不同的对象分配给变量或改变当前由变量引用的对象是有区别的.
(Re)的分配
当您执行如下任务时:
arr = []; // or any other value
……然后先前的价值不会改变.只是arr与之前的值分离并引用了一个新值.原始值(如果它是一个对象)继续存在,但是arr不再能够访问它.
旁注:如果没有其他变量再引用前一个值,垃圾收集器将在某个时间点释放它使用的内存.但这不是你的情况,因为全局变量arrN仍然引用原始值.
变异
如果你没有为arr赋值,而是将变量应用于它,例如使用splice,push,pop或对其中一个属性的赋值,例如arr [0] = 1或arr,这是另一回事. [1].在这些情况下,arr会持续引用同一个对象,并对其引用的对象进行更改,这对于引用同一对象的任何其他变量(如arrN)都是可见的.
清除阵列
现在,如果要清除传递给函数的数组,则必须避免进行类似arr = ….的赋值,而是使用可以在适当的位置改变数组的方法:
arr.splice(0)
或者,或者:
arr.length = 0;
现在你实际上已经改变了数组,这也是arrN引用的数组.