赋值后变量的值未更新

Value of variable not getting updated after assignment

提问人:adi 提问时间:5/27/2017 最后编辑:PM 77-1adi 更新时间:9/8/2023 访问量:906

问:

var a = 2;
var b = a;

console.log( b ); //2

a= 5;

console.log( b ); //2

问:为什么即使变量“a”被分配了不同的值,变量“b”也会得到值 2

JavaScript的

评论

0赞 Jeremy Jackson 5/27/2017
设置 B 时 A 为 2,B 为 2。
1赞 stark 5/27/2017
您将 javascript 与 Verilog 混淆了。
3赞 le_m 5/27/2017
number是基元数据类型,而不是“引用”。查看 stackoverflow.com/questions/13266616/...
0赞 melpomene 5/27/2017
因为它们是不同的变量?
0赞 PM 77-1 5/27/2017
stackoverflow.com/questions/13266616/......

答:

1赞 Thomas Wikman 5/27/2017 #1

原因编号是不可变的。

更改不可变值会用新值替换原始值,因此原始值不会更改(这就是 )。b = 2

如果需要引用,请使用对象和/或数组var a ={value: 2}, b = a a.value = 3 // also changes the value of be, since it can mutate

2赞 Damien 5/27/2017 #2

console.log(b)返回,因为当您访问基元类型时,您直接处理其值。2

1赞 Thiatt 5/27/2017 #3

在 javascript 中,基元(数字、布尔、字符串)按值分配,只有对象按引用分配。

1赞 97amarnathk 5/27/2017 #4

在 Javascript 中,整数是 。这意味着对象的值一旦分配就无法更改。当你这样做时immutable

a=5;
b=a;

确实,两者都是同一对象的名称,其值为 。 稍后当你这样做时——5

a=2

它为引用分配一个值为 2 的新对象。所以现在基本上指向一个新对象。两个对象都存在。aa

为了更好地理解,您可以参考此链接

1赞 Oghli 5/27/2017 #5

在 javascript 中执行基元值赋值时:

需要指出的是,这项任务并不捆绑在一起。事实上,所发生的只是 的值被复制到 ,所以当我们去改变时,我们不必担心影响。这是因为这两个变量由两个不同的内存位置支持,没有交叉。ababab

简言之:

当您分配b = a

实际上,您没有复制变量的引用并指向内存中的相同变量位置。ab

您只需复制变量的值并将其放入具有不同内存位置的新变量中。ab

0赞 trincot 9/8/2023 #6

其他人可能会告诉你这与不变性有关,但事实并非如此。即使使用可变值运行示例,它的行为也是一样的:

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 此规则也有例外,例如草率模式下的参数