1

为什么这段代码会两次提醒同一件事(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

4 回答 4

2

在 JavaScript 中,所有值要么是原始值(数字、字符串、布尔值、、null),undefined要么是对对象的引用(其中包括数组、函数等)。

只有一个数组,两个变量都持有对该数组的引用。

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

var arr = [1,2,3];
var new_arr = arr.slice();
于 2013-04-02T10:17:19.810 回答
1

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

这与引用和值类型有关。

于 2013-04-02T10:17:16.373 回答
1

中的数组JavaScriptreference object.

于 2013-04-02T10:20:29.790 回答
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
于 2013-04-02T10:34:35.680 回答