哪种类型的变量会如此变化?
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没有改变?什么类型的变化是这样的?
答案 0 :(得分:3)
在javascript Arrays & Objects
中通过引用传递,因此将其更改为一个地方会影响其他人。
number
,string
之类的原语按值传递,因此在一个地方更改它们并不会影响其他地方。
var a,b;
a=10;
b=a;
所以b
& a
有类似下面的结构
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
让我们按a
增加1
,现在价值将在1000
处更改。
a ---1000----> [11]
b ---1004----> [10]
obj1 = {}; // obj1 has a reference
obj1
的结构类似于bellow
------->1000--------->[{}]
obj1 -------1004----->[1000] //this '1000' is a reference which has a `{}` at it's place
这一行
obj2 = obj1;
此行之后obj2
& obj
分享相同的参考
-------> 1000 ---------> [{}]
obj1 ------- 1004 -----> [1000]
obj2 ------- 1008 -----> [1000]
obj1.ab = 5;
此行正在向ab
obj1
的字段
------->1000--------->[{ab:5}]
obj1 -------1004----->[1000]
obj2 -------1008----->[1000]
因为obj1
& obj2
具有相同的引用,您将获得两个字段ab
。
obj1 // Object {ab: 5}
obj2 // Object {ab: 5}
注意: - 感谢答案的任何改进。
答案 1 :(得分:1)
如果更改其引用,则原始数据类型(数字,字符串和布尔值)不会更改,而复合数据类型执行会更改。
http://msdn.microsoft.com/en-us/library/ie/7wkd9z69(v=vs.94).aspx
答案 2 :(得分:0)
这是因为数组在它们之间共享引用,而整数共享值。 当引用被更改时,它会影响具有相同引用的其他引用,但是值不是这样的,因为js编译器为它们分配单独的内存并且修改它们仅影响它们。
要可视化参考类型,
Reference --------> { ab : 5 } // Changing affects others with same reference
^
| --> arr1
| --> arr2
| --> arr3
要显示值类型,
int1 ---> 42 --> +3 ---> 45 // Doesn't affect others
int2 ---> 42
int3 ---> 42
答案 3 :(得分:0)
arr1包含空列表的引用。然后arr3接收相同列表的引用,并且arr2是同一列表的引用。因此,当你制作arr1.ab = 5时,你在该列表中添加了一个名为' ab'并给出了值5.但是由于arr2和arr3指向同一个列表,因此您将获得相同的值。