JavaScript - 为什么增量运算符会修改不可变字符串?

JavaScript - Why does the increment operator modify immutable strings?

在JavaScript中,字符串是不可变的。这意味着对它们的任何操作 return 都是一个新对象。 trimreplaceslice 等方法不会修改现有字符串。

但是我在jsconsole里玩,发现异常

string = "string";
string + 37;
=> "string37"
string;
=> "string"

原始字符串在这里没有改变。下面是我在字符串上应用增量运算符时发生的情况。在这里我期待看到 string returned.

string++;
=> NaN
string
=> NaN

我想看看这是否会 return strinh,就像在其他一些语言中一样。

无论 string++ 是否有效,它都不应该修改现有的字符串对象。然而它就是这样做的。有谁知道为什么?

++ 运算符的工作方式类似于:

string = string + 1;

因此,您正在重新分配给该变量。 (而原始字符串保持不变)

如果您自己 运行 string = string + 1,您会注意到它的结果是 string1。这是因为 1 被转换为字符串,然后被视为 "append"。 (同样,永远不要修改原始字符串 value

然而,++ 并不试图强制任何东西,它只是试图将一个非数字(即:string)添加到一个数字(1)和结果是 NaN.

这是一个简单的例子:

var baz = "string";
baz = 5;

当然我们没有通过将baz赋值给5来修改字符串"string"的值。相反,我们只是简单地完全取消了字符串,并将值 5 放在它的位置。同样,您的示例不会通过将变量分配给 NaN.

来更改任何字符串

您希望变量 string 是一个 常量 ,但事实并非如此。此外,常量变量和不可变值是不同的东西。您还没有将不可变字符串 "string" 更改为 NaN;您已将不可变值 "string" 替换为完全不同的值 NaN.

你的操作通过使用不可变字符串作为操作数来创建新值。

在支持const关键字的环境中考虑一个真正的常量变量:

> const foo = 5;
> foo++
  5

现在考虑一个作为对象的常量变量:

> const bar = {};
> bar.baz = 5
> bar
  { baz: 5 }
> bar = 10;
> bar
  { baz: 5 }

在这种情况下,我们改变了值(因为值不是不可变的)但无法改变变量包含的哪个值。您的示例没有使用常量变量,因此变量 string 可以自由更改其值。