3

我在这里完全错过了一些东西。我需要定义一个基本变量。然后在一系列第二个变量中引用该基本变量。将为每个第二变量提供替代值。但是我看到修改后的值回血到基本变量

例如

<script>
var a = [{a:1}];
var b = a;
b.a = 22;
alert('a-a equals' + a.a + ' and b-a equals ' + b.a);
</script>

我希望 aa 等于 1,ba 等于 22。但是我看到两者都等于 22。有人可以解释我缺少什么吗?

4

4 回答 4

3

您错过了var b = a;不创建ainto的新副本的事实b,它实际上分配了存储在into中的对象的引用。这意味着您对存储在其中的对象采取的任何操作都同时发生在存储在其中的对象上。那是因为实际上它们是完全相同的对象! abba

a并且b实际上只是告诉代码它可以在内存中找到底层对象的位置,在这种情况下,它们都指向同一个地方。

于 2013-06-18T18:21:34.847 回答
1

var b = a;这只会复制对实际数组的引用(不会复制数组

你可以像这样复制你的数组 -

var a1 = [{a:1}];
var a2 = JSON.parse(JSON.stringify(a1));
a2[0].a = 22;
console.log('a-a equals' + a1[0].a + ' and b-a equals ' + a2[0].a);

或者 -

var a2 = $.map(a1, function (obj) {
    return $.extend({}, obj);
});

演示--> http://jsfiddle.net/vTpSk/

于 2013-06-18T18:28:15.893 回答
0

当您将 a 分配给 b 时,Javascript 不会克隆引用类型。如果你想使用jquery cloneextend有办法做到这一点。

例如,你可以做

var a = $.extend({}, a, b);
于 2013-06-18T18:24:27.713 回答
0

对象通过引用传递。当你这样做时var b = a,因为a是一个数组并且数组是对象,所以数组是通过引用传递的,所以b引用与 相同的数组a。相反,您需要创建一个副本a并将其存储在b.

要复制数组,您只需使用a.slice(0)

// NOTE! this example doesn't work, explained below.
var a = [{a:1}];
var b = a.slice(0);
b[0].a = 22;
alert('a-a equals' + a[0].a + ' and b-a equals ' + b[0].a);

但是,由于您的数组包含一个对象,因此数组中的对象仍然引用同一个对象!因此,您将不得不对数组进行循环,从内到外重新创建数组。jQuery 的 $.extend 方法可以在这里使用:

var a = [{a:1}];
var b = [];
for (var i = 0; i < a.length; i++) {
    b.push( $.extend({},a[i]) );
}
b[0].a = 22;
alert('a-a equals ' + a[0].a + ' and b-a equals ' + b[0].a);

http://jsfiddle.net/e9Lja/

另一种方法是使用 jquery$.extend结合$.makeArray

var a = [{a:1}];
var b = $.makeArray($.extend({},a));
b[0].a = 22;
alert('a-a equals ' + a[0].a + ' and b-a equals ' + b[0].a);

http://jsfiddle.net/e9Lja/1/

不过,我更喜欢 for 循环或 $.map(请参阅 pXL 的答案),因为$.extend它不适合复制数组。

于 2013-06-18T18:26:16.997 回答