javascript - 为什么数字在 Javascript 中是不可变的?

标签 javascript immutability

我已经阅读了这里的问答:

javascript numbers- immutable

但我不太清楚为什么数字(原始类型)是不可变的?仅仅因为他们创建了一个新的引用但没有覆盖值?

如果在每个assignemt上创建一个新的引用

var x = 5;
x = 1;

我们会在下面的循环中有 100 次新引用吗?

while (x < 101)
{
    x++;
}

效率高吗?我想我看错了。

最佳答案

老实说,我不太确定您希望得到什么样的答案,因为我不太明白您对什么感到困惑。但我们开始吧:

Would we have 100 times a new reference in the following loop?

变量只是值的容器。在低级别上,变量基本上只是内存地址或寄存器的标签。例如。变量 x 可能指向寄存器 R1

x++ 只会将存储在该寄存器中的数字增加 1。让我们假设我们的寄存器看起来像这样:

R1: 5

自增之后,可以是单个操作,例如ADD R1 1,我们会得到

R1: 6

即我们简单地用一个新值覆盖了以前的值。我们多次这样做。


Is that efficient? I think I am not seeing correctly.

将数字加一是最简单的操作。

当然,您可以在更高级别上实现可变数字,但这肯定不会使事情变得更高效或更简单。

可变性对于“单值”值没有多大意义,因为改变这样的值基本上意味着用“就地”的不同值替换它。

可变性对于由其他值组成的值更有意义,例如列表和字典,其中一部分发生变化而另一部分保持不变。

此外,只有当一种语言具有引用类型 数据类型时,可变性才显得相关。我的意思是多个变量可以保存对数据类型的相同值的引用。对象在 JavaScript 中是引用类型的,这允许您这样做:

var a = {foo: 42};
var b = a;
b.foo = 21;
console.log(a);

如果数据类型不是引用类型(称为值类型)(JavaScript 中的原始值),则可变性无关紧要,因为它与不变性无法区分。考虑以下具有可变值类型数字的假设场景:

var a = MutableNumber(42);
var b = a; // creates a copy of MutableNumber(42) because it's a value type
a.add(1);
console.log(a, b); // would log 43, 42

在这种情况下,两个变量不可能引用相同的可变数值,a.add(1) 与将新值分配给 a 没有区别>(即 a = a + 1)。

关于javascript - 为什么数字在 Javascript 中是不可变的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46392335/

相关文章:

javascript - 这种 WebSockets 方法正确吗?

java - 使用不同的方法设置对象的多个字段

java - 确保不可变列表中可变对象的不可变性

python - 为什么可变变量不能在没有链接的情况下一起分配?

java - 为什么 String 类是不可变的,即使它有一个名为 "hash"的非最终字段

javascript - 这可能是关于什么的? [TsLint 错误 : "Promises must be handled appropriately"]

javascript - 使用 JSON 和 jQuery Mobile 的多级列表菜单

javascript - 单击按钮时 HTML 函数不返回值

c# - 如何在 C# 中使 DateTime 对象不可变(声明为 const)?

javascript - AngularJS 循环遍历数组(一系列数字)