为什么这段代码警告两次相同的事情(1,2,3,4)?
var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);
答案 0 :(得分:2)
在JavaScript中,所有值都是原始值(数字,字符串,布尔值,null
,undefined
)或对象的引用(其中包括数组,函数等)。
只有一个数组,两个变量都保存对此数组的引用。
如果您想要另一个数组,以便您可以单独更改它们,请复制第一个:
var arr = [1,2,3];
var new_arr = arr.slice();
答案 1 :(得分:1)
因为当您更改第二个变量时,您正在操作底层数组,这两个变量都是由两个变量引用的(代表该事物),但它只是一个事物,然后显示,两次。
答案 2 :(得分:1)
JavaScript
中的数组为reference object
。
答案 3 :(得分:1)
执行此操作时:
var arr = [1,2,3];
var new_arr = arr;
现在有两个指向同一数据结构的变量。数组的赋值是通过引用来指定的,这意味着不会创建数据的副本,这两个变量只指向同一个数组。
因此,无论您修改哪个变量,您都将更改它们指向的同一条数据。
所以,当你这样做时:
new_arr[new_arr.length] = 4;
数据的单一副本已被修改,两个变量都将报告相同的更改。
在javascript中,如果你想要数据的副本,那么你必须明确地创建一个副本,你还必须知道是否要创建浅拷贝(只复制顶级项目)或深拷贝(甚至复制嵌套在数组中的对象或数组。)
对于.slice()
方法的数组,浅复制非常容易。
var arr = [1,2,3];
// make a copy of the array
var new_arr = arr.slice(0);
// modify the copy
new_arr[new_arr.length] = 4;
alert(arr); // shows length of 3
alert(new_arr); // shows length of 4