为什么这段代码会两次提醒同一件事(1,2,3,4)?
var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);
为什么这段代码会两次提醒同一件事(1,2,3,4)?
var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);
在 JavaScript 中,所有值要么是原始值(数字、字符串、布尔值、、null
),undefined
要么是对对象的引用(其中包括数组、函数等)。
只有一个数组,两个变量都持有对该数组的引用。
如果您想拥有另一个数组,以便您可以独立更改它们,请复制第一个:
var arr = [1,2,3];
var new_arr = arr.slice();
因为当您更改第二个变量时,您正在操作底层数组,该数组被两个变量引用(代表事物),但它只是一件事,然后显示两次。
这与引用和值类型有关。
中的数组JavaScript
是reference object
.
当你这样做时:
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