我已经阅读了这里的问答:
但我不太清楚为什么数字(原始类型)是不可变的?仅仅因为他们创建了一个新的引用但没有覆盖值?
如果在每个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/