JavaScript - 为什么增量运算符会修改不可变字符串?
JavaScript - Why does the increment operator modify immutable strings?
在JavaScript中,字符串是不可变的。这意味着对它们的任何操作 return 都是一个新对象。 trim
、replace
和 slice
等方法不会修改现有字符串。
但是我在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
可以自由更改其值。
在JavaScript中,字符串是不可变的。这意味着对它们的任何操作 return 都是一个新对象。 trim
、replace
和 slice
等方法不会修改现有字符串。
但是我在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
可以自由更改其值。