js变量很奇怪

时间:2013-04-02 10:16:15

标签: javascript arrays variables var

为什么这段代码警告两次相同的事情(1,2,3,4)?

var arr = [1,2,3];
var new_arr = arr;
new_arr[new_arr.length] = 4;
alert(new_arr);
alert(arr);

4 个答案:

答案 0 :(得分:2)

在JavaScript中,所有值都是原始值(数字,字符串,布尔值,nullundefined)或对象的引用(其中包括数组,函数等)。

只有一个数组,两个变量都保存对此数组的引用。

如果您想要另一个数组,以便您可以单独更改它们,请复制第一个:

var arr = [1,2,3];
var new_arr = arr.slice();

答案 1 :(得分:1)

因为当您更改第二个变量时,您正在操作底层数组,这两个变量都是由两个变量引用的(代表该事物),但它只是一个事物,然后显示,两次。

这与reference and value types有关。

答案 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