提问人:adi 提问时间:5/27/2017 最后编辑:PM 77-1adi 更新时间:9/8/2023 访问量:906
赋值后变量的值未更新
Value of variable not getting updated after assignment
问:
var a = 2;
var b = a;
console.log( b ); //2
a= 5;
console.log( b ); //2
问:为什么即使变量“a”被分配了不同的值,变量“b”也会得到值 2
答:
原因编号是不可变的。
更改不可变值会用新值替换原始值,因此原始值不会更改(这就是 )。b = 2
如果需要引用,请使用对象和/或数组var a ={value: 2}, b = a
a.value = 3 // also changes the value of be, since it can mutate
console.log(b)
返回,因为当您访问基元类型时,您直接处理其值。2
在 javascript 中,基元(数字、布尔、字符串)按值分配,只有对象按引用分配。
在 Javascript 中,整数是 。这意味着对象的值一旦分配就无法更改。当你这样做时immutable
a=5;
b=a;
确实,两者都是同一对象的名称,其值为 。
稍后当你这样做时——5
a=2
它为引用分配一个值为 2 的新对象。所以现在基本上指向一个新对象。两个对象都存在。a
a
为了更好地理解,您可以参考此链接
在 javascript 中执行基元值赋值时:
需要指出的是,这项任务并不捆绑在一起。事实上,所发生的只是 的值被复制到 ,所以当我们去改变时,我们不必担心影响。这是因为这两个变量由两个不同的内存位置支持,没有交叉。a
b
a
b
a
b
简言之:
当您分配b = a
实际上,您没有复制变量的引用并指向内存中的相同变量位置。a
b
您只需复制变量的值并将其放入具有不同内存位置的新变量中。a
b
其他人可能会告诉你这与不变性有关,但事实并非如此。即使使用可变值运行示例,它的行为也是一样的:
var a = [2];
var b = a;
console.log( b ); // [2]
a = [5];
console.log( b ); // [2]
这种行为不是用不变性来解释的,而是用赋值和突变之间的区别来解释的。每个变量都有自己的内存位置1,因此当两个变量恰好具有相同的值时,此值会出现两次(如果是对象,这意味着两个变量都有对该对象的引用的副本)。当您分配给这两个变量之一时,另一个变量不受影响。
但是,当两个变量具有对同一对象的引用,并且您改变该对象(通过分配给属性,而不是变量)时,当然两个变量仍将引用相同的单个对象(因为它们的值/引用没有更改)。对象已发生变异:
var a = [2];
var b = a;
console.log( b ); // [2]
a[0] = 5; // We don't assign to `a`, but to the array index (property)!
console.log( b ); // [5]
但是可变性与属性赋值有关(属性所属的对象将发生变异),而不是变量赋值。
1 此规则也有例外,例如草率模式下的参数
。
评论
number
是基元数据类型,而不是“引用”。查看 stackoverflow.com/questions/13266616/...