var arrN = [1, 2, 3];
function init(arr){
arr = [];
console.log(arrN) //output [1, 2, 3], expect []
}
init(arrN);
使用splice
或push
方法时,正在修改传递给函数的数组。所以我试图了解使用赋值运算符时发生了什么,为什么它不更改数组?它是否创建了传递数组的本地var
?
任何帮助将不胜感激!
答案 0 :(得分:3)
您需要区分变量和实际对象(数组)。 splice
和push
正在更改对象。
arr = []
只是更改变量,旧对象保持原样。
答案 1 :(得分:2)
将不同的对象分配给变量或改变当前由变量引用的对象是有区别的。
当您执行以下任务时:
arr = []; // or any other value
...然后arr
先前的值不会改变。只是arr
与之前的值分离并引用了一个新值。原始值(如果它是一个对象)继续存在,但arr
无法再访问它。
附注:如果没有其他变量再引用前一个值,垃圾收集器将在某个时间点释放它使用的内存。但这不是你的情况,因为全局变量arrN
仍然引用原始值。
如果您没有为arr
分配值,而是将变种应用于其中,例如使用splice
,{{ 1}},push
或对其中一个属性的分配,例如pop
或arr[0] = 1
。在这些情况下,arr[1]++
不断引用同一个对象,并对其引用的对象进行更改, 对引用同一对象的任何其他变量可见,如{{1 }}。
现在,如果要清除传递给函数的数组,则必须避免进行arr
之类的赋值。相反,使用改变数组的方法:
arrN
或者,或者:
arr = ...
现在你实际上已经改变了数组,这也是arr.splice(0)
引用的数组。
答案 2 :(得分:2)
在JavaScript中,特别是在处理对象时,赋值运算符(=
)有三个作业。
如;
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
的值将是[]
,因为您在函数中重新分配它。