You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript字符串是不可变的,为什么+=运算符能修改字符串值?

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生成了新字符串hello world,但你没有修改originalString的指向,所以它依旧指向原来的hello字符串,完全符合字符串不可变的特性。

+=操作的本质是变量重赋值,不是字符串突变

你写的originalString2 += ' world'只是语法糖,完全等价于以下代码:

originalString2 = originalString2 + ' world'

整个执行流程是:

  1. 取出originalString2当前指向的字符串hello
  2. 和 world拼接生成全新的字符串值hello world
  3. 把新字符串的引用重新赋值给originalString2变量

原来的hello字符串本身没有任何修改,只是不再被originalString2指向,后续会被JS引擎垃圾回收。

你疑惑的「原字符串被修改」本质是变量的指向变了,不是字符串值本身被修改。这个逻辑和数字操作完全一致:let a = 1; a += 1得到2,从来没有人会认为这是「数字1被突变了」,只是变量a被重新赋值为2而已,字符串的+=操作逻辑完全相同。

对错误文章的纠正

部分文章称「+=会突变原字符串」属于典型的概念错误,混淆了变量赋值和值突变的区别。你可以用以下代码直接验证字符串不可变的特性:

let str = 'hello';
str[0] = 'H'; // 尝试修改字符串第一个字符
console.log(str); // 输出依旧是hello,原字符串完全没有变化

内容的提问来源于stack exchange,提问作者Case Silva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 00:45:05