数组重新/赋值引用更改

时间:2016-01-10 10:48:39

标签: javascript

在javascript数组中,对象因此通过引用传递。所以

var a = ["a"];
var b = a;
console.log(b);
a[0] = "wtv";
console.log(b);

将改变b值。

我不明白的是为什么

var a = ["a"];
var b = a;
console.log(b);
a = ["wtv"];
console.log(b);

是不是在改变b值?这背后的原因是什么?

4 个答案:

答案 0 :(得分:4)

因为内容a指向的值因作业a = ["wtv"];而改变。

而在第一个示例中,您更改a的部分/属性,而内存中的对象a指向保持不变。

解释它的图像:

enter image description here

答案 1 :(得分:2)

这是因为您b只是复制a的引用。

所以他们有相同参考文献的副本,但每个参考文献都有自己的副本。

var a = ["a"];

// b now holds a copy of the reference from a
var b = a;

// when you change a, b is unaffected since it has an independent reference
// a now points to a new location in memory
// a has a new reference, whereas b still has the reference from before
a = ["wtv"];

但是,由于两个变量 do 具有相同的引用,即使它们是副本,您也可以更改对象或数组本身内的数据,并使其影响这两个变量。

以此为例:

// a points to a location in memory
var a = [];

// we give a some value
a["foo"] = 'bar';

// b now has a *copy* of a's location in memory
var b = a;

// since b shares the same location in memory as a, it has the same foo value
console.log(b.foo); // => bar

// we update a's foo value
a["foo"] = 'baz';

// since b still shares the same location in memory as a, 
// it's pointing to the same foo from a, therefore it's also affected
console.log(b.foo); // => baz

@Hidde有一个很棒的图像,有助于可视化内存所指向的幕后内容。

答案 2 :(得分:1)

使用a = ["wtv"];,您可以将全新数组分配给变量a。它与以前的参考无关。

答案 3 :(得分:1)

JavaScript中的数组也是一个对象,对象总是通过引用传递/分配。因此,两个变量都引用同一个对象,因此一个变量将反映另一个变化,因为它们都指向相同的值。

在后一种情况下,您要为var a分配一个新值,而这将存储在不同的内存位置,而不是存储在b的内存位置,它类似于做

var a = 5;
var b = a;
a = a - 1;
alert(b); // alerts 5
alert(a); // alerts 4