如果字符串在Javascript中是不可变的,为什么+=操作符的工作方式?



我读到的关于在Javascript中修改字符串的所有内容都说字符串是不可变的。这就是为什么concat返回一个新字符串,它是原字符串的修改:

let originalString = 'hello';
let modifiedString = originalString.concat(' world');
console.log('originalString:', originalString);
console.log('modifiedString:', modifiedString);

结果:

"originalString: hello"

modifiedString: hello world">

到目前为止,它是有意义的。原始字符串仍然即使concat因为字符串是不可变的。

但是,如果我做以下操作:

let originalString2 = 'hello';
let modifiedString2 = originalString2 += ' world';
console.log('originalString2:', originalString2);
console.log('modifiedString2:', modifiedString2)

的结果是:

originalString2: hello world

modifiedString2: hello world

在我看来,这确实像是在改变原始字符串。如果不是这样,有人能给我解释一下吗?我甚至发现一些文章在讨论修改字符串的方法时,在开头说"Javascript字符串是不可变的"。然后接着说+=方法正在改变原始字符串,所以我得到了相互矛盾的信息。

jsfield的简单测试

我认为这是因为你使用的short hand addition operator (+=)。它实际上做了两个操作首先是addition,然后是assignment

let x = 2;
x += 2;
// The above line is equivalent to the following.
x = x + 2;

对于你的例子

let str = "hello";
str += "world"; // is the same as 
str = str + "world";

所以我们通过str + "world"创建一个新的字符串,然后将其分配给我们的str变量。所以它仍然是不可变的:)

最新更新