JavaScript中的数字是否是不可变的?

8

可能重复:
JavaScript数字-不可变

我读过道格拉斯·克罗克福德的书《JavaScript语言精粹》。书中说JavaScript中的数字是不可变的。但是JavaScript中的数字是按值复制的,我们可以使用运算符++来改变它的值。那么为什么说它是不可变的?如果它是不可变的,为什么数字会被按值复制呢?


请看这里的答案:https://dev59.com/-F3Va4cB1Zd3GeqPBpGr - Gatekeeper
1
@ Gatekeeper 我认为它们是不同的。 - Xiaotian Pei
与其他编程语言不同的是,JavaScript 中的 ++ 运算符并不改变数值本身,而是创建一个新的数值。请尝试运行以下代码:let n = 0; let m = n; console.log(m, n, m === n); ++m; console.log(m, n, m === n); - Min-Soo Pipefeet
2个回答

6

由于它们是按值复制的,所以它们是不可变的。

当您执行以下操作时

var x = 4;
x += 1;

你并没有将数字 4 改成数字 5。你只是将变量 x 中存储的值从 4 改成了 5

如果我改变了变量x中存储的值,为什么说它是不可变的?我认为“不可变”意味着无法更改变量指向的内存。 - Xiaotian Pei
我认为 += 也是一种赋值方式,如果 x 是不可变的,则将变量绑定到另一个内存。 - Xiaotian Pei

0
当您修改对象的成员时,您修改了其内容。变量的值(即引用)保持不变。这是可变的。
当您声明字符串时,它具有一个值,但当您更改该值时,实际上会创建一个新字符串。这意味着它是不可变的。
类似于数字。您无法将3更改为4。 3始终是3,永远不会变成其他任何值。因此,当您将变量分配给另一个数字时,您正在在内存中创建一个新数字,而不是将某个变量指向的某个内存的内容分配给不同的值。

++运算符呢?它是否也会在内存中创建一个新的数字? - Xiaotian Pei
x++与x+=1是相同的,所以是的。 - James Wiseman
我认为这很令人困惑。在Python中,整数也是不可变的,并且Python不提供++运算符。我认为背后的原因是++让人们误以为值是就地更改的。而我不明白为什么JavaScript会以如此不寻常的方式行事。 - Xiaotian Pei
不仅 JavaScript 支持 ++。C#,Java,C,C ++ 等也支持。这只是 x = x + 1 的简写,但是还支持前缀和后缀增量的概念(x++ = 前缀,++x = 后缀)。简而言之,这是一个几十年历史的概念,JavaScript 的行为并不异常。 - James Wiseman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接