我读到的关于在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
变量。所以它仍然是不可变的:)