为什么更改一个数组会改变另一个?

Dan*_*son 2 javascript arrays

考虑这一点点的JavaScript代码:

var a = [1, 2, 3],
    b = a;

b[1] = 3;

a; // a === [1, 3, 3] wtf!?
Run Code Online (Sandbox Code Playgroud)

当我更新"b [1]"时为什么"a"会改变?我在Firefox和Chrome中测试过它.例如,这不会发生在简单的数字上.这是预期的行为吗?

var a = 1,
    b = a;

b = 3;

a; // a === 1 phew!
Run Code Online (Sandbox Code Playgroud)

Poi*_*nty 8

因为"a"和"b"引用相同的数组.其中没有两个; 将"a"的值赋给"b"将引用分配给数组,而不是数组的 副本.

分配数字时,您正在处理原始类型.即使在Number实例上也没有更新值的方法.

您可以使用Date实例看到相同的"它们指向同一对象"行为:

var d1 = new Date(), d2 = d1;
d1.setMonth(11); d1.setDate(25);
alert(d2.toString()); // alerts Christmas day
Run Code Online (Sandbox Code Playgroud)


Nic*_*ver 7

它是相同的数组(因为它是一个对象,它是相同的引用),你需要创建一个副本来单独操作它们.slice()(它创建一个新的数组,复制的第一级元素),如下所示:

var a = [1, 2, 3],
    b = a.slice();

b[1] = 3;

a; // a === [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)