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中,
像
1 2 3 | var a,b; a=10; b=a; |
因此,
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 2 | a ---1000----> [11] b ---1004----> [10] |
在数组和对象中
1 | obj1 = {}; // obj1 has a reference |
1 2 | ------->1000--------->[{}] obj1 -------1004----->[1000] //this '1000' is a reference which has a `{}` at it's place |
这条线
1 | obj2 = obj1; |
在这行之后,
1 | obj1.ab = 5; |
此行将一个名为
1 2 3 | ------->1000--------->[{ab:5}] obj1 -------1004----->[1000] obj2 -------1008----->[1000] |
由于
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 |