关于Javascript:Javascript – 变量引用更改

Javascript - Variable References Changing

本问题已经有最佳答案,请猛点这里访问。

什么样的变量会发生这样的变化?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
var int1;
var int2;
var int3;

int1 = 42;
int2 = int3 = int1;
int1 += 3;

int1      // 45
int2      // 42
int3      // 42



arr1 = {};
arr2 = arr3 = arr1;
arr1.ab = 5;

arr1      // Object {ab: 5}
arr2      // Object {ab: 5}
arr3      // Object {ab: 5}

就像为什么Int2和Int3改变了,而arr2和arr3没有?什么类型的变化像这样?


在javascript中,Arrays & Objects是通过引用传递的,因此更改一个位置会影响其他位置。

numberstring这样的原语是按价值传递的,因此在一个地方改变它们不会影响到其他原语。

基元

1
2
3
var a,b;
a=10;
b=a;

因此,ba具有类似于下图的结构。

1
2
a ---1000----> [10] a is pointing to some location(lets 1000) which have value 10
b ---1004----> [10] b is pointing to some location(lets 1004) which have value 10

让我们用1增加a,现在值将在1000处改变。

1
2
a ---1000----> [11]
b ---1004----> [10]

在数组和对象中

1
obj1 = {}; // obj1 has a reference

obj1具有如下结构:

1
2
------->1000--------->[{}]
obj1 -------1004----->[1000] //this '1000' is a reference which has a `{}` at it's place

这条线

1
obj2 = obj1;

在这行之后,obj2obj共享相同的引用——————————————>[]对象1-------1004----->[1000]对象2-------1008----->[1000]

1
obj1.ab = 5;

此行将一个名为ab的字段添加到obj1的引用中。

1
2
3
------->1000--------->[{ab:5}]
obj1 -------1004----->[1000]
obj2 -------1008----->[1000]

由于obj1obj2具有相同的引用,因此您将获得两个字段的ab

1
2
obj1      // Object {ab: 5}
obj2      // Object {ab: 5}

注:如有任何改进,我们将不胜感激。


如果更改基元数据类型的引用,则基元数据类型(数字、字符串和布尔值)不会更改,而复合数据类型则会更改。

http://msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx


arr1包含空列表的引用。然后arr3接收同一列表的引用,arr2接收同一列表的引用。因此,当您使arr1.ab=5时,您在列表中添加了一个名为"ab"的项,并给出了值5。但由于arr2和arr3指向同一个列表,您将得到相同的值。


这是因为数组共享它们之间的引用,而整数共享值。当一个引用被更改时,它会影响其他具有相同引用的人,但是值并不是这样的,因为JS编译器为它们分配单独的内存,修改它们只会影响它们。

要可视化引用类型,

1
2
3
4
5
Reference --------> { ab : 5 } // Changing affects others with same reference
              ^
              | --> arr1
              | --> arr2
              | --> arr3

要可视化值类型,

1
2
3
int1 ---> 42 --> +3 ---> 45 // Doesn't affect others
int2 ---> 42
int3 ---> 42