【问题标题】:Javascript - Variable References Changing [duplicate]Javascript - 变量引用更改[重复]
【发布时间】:2014-11-29 04:12:06
【问题描述】:

什么类型的变量会这样变化?

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 variables


【解决方案1】:

在 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 具有如下结构

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

这一行

obj2 = obj1;

在此行之后 obj2obj 共享相同的引用 ------->1000--------->[{}] obj1 --------1004----->[1000] obj2 --------1008----->[1000]

obj1.ab = 5; 

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

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

因为 obj1obj2 具有相同的引用,所以您将获得两者的字段 ab

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

注意:-对答案的任何改进表示赞赏。

【讨论】:

  • 这是不正确的。一切都是按值传递的。在对象的情况下,该值 一个引用。不过,通过引用传递是另一回事。对象和基元最大的区别在于对象是可变的。
  • @FelixKling,更新了我的答案,谢谢你的观点
  • @JhKaiz:如果您对obj1 进行变异,则会中断。通过原型继承模拟不变性只能以一种方式工作,并且比有用的 IMO 更令人困惑。同样,在 JS 中,一切都是 按值传递。维基百科有一篇巨大的文章解释了传递值的不同方式。
  • 谢谢@FelixKling,我明白了。删除了我的错误解决方案。所以,唯一通过 value != 引用的 Object 的值是让它成为一个返回新对象的函数,不是吗?
【解决方案2】:

如果更改其引用,原始数据类型(数字、字符串和布尔值)不会更改,而复合数据类型更改。

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

【讨论】:

  • 这个回答有点肤浅。它没有解释 reference 在这种情况下的含义。如果你只是说原语是不可变的,而对象不是,那是正确的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    这是因为数组共享它们之间的引用,而整数共享。 当一个引用被改变时,它会影响其他拥有相同引用的人,但是值不是那样的,因为 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-25
      • 2019-11-11
      • 1970-01-01
      • 2012-07-28
      相关资源
      最近更新 更多