考虑一下这段 javascript 代码:
var a = [1, 2, 3],
b = a;
b[1] = 3;
a; // a === [1, 3, 3] wtf!?
为什么当我更新“b[1]”时“a”会改变?我已经在 Firefox 和 Chrome 中对其进行了测试。例如,这不会发生在一个简单的数字上。这是预期的行为吗?
var a = 1,
b = a;
b = 3;
a; // a === 1 phew!
考虑一下这段 javascript 代码:
var a = [1, 2, 3],
b = a;
b[1] = 3;
a; // a === [1, 3, 3] wtf!?
为什么当我更新“b[1]”时“a”会改变?我已经在 Firefox 和 Chrome 中对其进行了测试。例如,这不会发生在一个简单的数字上。这是预期的行为吗?
var a = 1,
b = a;
b = 3;
a; // a === 1 phew!
它是同一个数组(因为它是一个对象,所以它是同一个引用),您需要创建一个副本来分别使用.slice()
(它创建一个新数组,其中第一级的元素被复制),如下所示:
var a = [1, 2, 3],
b = a.slice();
b[1] = 3;
a; // a === [1, 2, 3]
因为“a”和“b”引用同一个数组。他们没有两个;将“a”的值分配给“b”会将引用分配给数组,而不是数组的 副本。
当您分配numbers 时,您正在处理原始类型。即使在 Number 实例上也没有更新值的方法。
您可以在 Date 实例中看到相同的“它们指向同一个对象”行为:
var d1 = new Date(), d2 = d1;
d1.setMonth(11); d1.setDate(25);
alert(d2.toString()); // alerts Christmas day
除了其他答案之外,如果您想要一个数组的副本,一种方法是使用 slice 方法:
var b = a.slice(0)
所有 Javascript 对象都是通过引用传递的 - 您需要复制整个对象,而不是分配它。
对于数组,这很简单 - 只需执行以下操作:
var a = [1, 2, 3];
var b = a.slice(0);
whereslice(0)
返回从偏移量0
到数组末尾的数组。
此链接有更多信息。