在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值?这背后的原因是什么?
答案 0 :(得分:4)
答案 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