Javascript - 变量引用更改

时间:2014-10-04 06:03:03

标签: javascript variables

哪种类型的变量会如此变化?

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没有改变?什么类型的变化是这样的?

4 个答案:

答案 0 :(得分:3)

在javascript Arrays & Objects中通过引用传递,因此将其更改为一个地方会影响其他人。

numberstring之类的原语按值传递,因此在一个地方更改它们并不会影响其他地方。

基元

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指向同一个列表,因此您将获得相同的值。