为什么 JavaScript 中的数字是不可变的?

2024-04-19

我在这里阅读了问题和答案:

javascript 数字 - 不可变 https://stackoverflow.com/questions/8248568/javascript-numbers-immutable

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

如果在每个作业上创建一个新参考

var x = 5;
x = 1;

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

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

这样有效率吗?我想我看的不正确。


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

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

变量只是值的容器。在底层,变量基本上只是内存地址或寄存器的标签。例如。多变的x可能指向注册R1.

x++只需将存储在该寄存器中的数字增加1。假设我们的寄存器如下所示:

R1: 5

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

R1: 6

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


这样有效率吗?我想我看的不正确。

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

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

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

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

此外,只有当语言具有可变性时,可变性才显得相关。参考类型数据类型。我的意思是多个变量可以保存对数据类型的相同值的引用。 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 (i.e. a = a + 1).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 JavaScript 中的数字是不可变的? 的相关文章

随机推荐