JS字符串不可变性体现为每次操作都创建新对象:字面量存于只读内存,修改尝试被内存保护机制拒绝;所有方法返回新字符串,原字符串待GC回收;频繁拼接导致大量临时内存分配。

JS 中字符串不可变性在内存中体现为:每次“修改”操作都不改变原有字符串所在的内存块,而是分配新内存、复制内容、生成全新字符串对象。
字符串值存于只读内存区域
JavaScript 引擎(如 V8)将字符串字面量(如 "hello")存储在常量池或只读内存段中。这些区域不允许运行时写入——不是靠语法限制,而是底层内存保护机制直接拒绝修改请求。当你尝试 str[0] = 'H',引擎发现目标地址不可写,非严格模式下静默失败,严格模式下抛出 TypeError。
所有方法都返回新字符串,旧字符串仍驻留内存
调用 toUpperCase()、slice()、replace() 等方法时:
- 引擎计算新字符串所需长度,申请一块独立内存空间
- 把原字符串对应部分逐字节拷贝过去(可能经过编码转换,如 ASCII 转大写)
- 将新内存地址封装为新的 String 对象返回
- 原字符串对象若无其他引用,会在后续垃圾回收(GC)中被清理;否则继续存在
例如:let a = "abc"; let b = a.toUpperCase(); → a 和 b 指向两块不同内存,内容分别为 "abc" 和 "ABC"。
DMap GL地图JSAPI(dmapgl)开发指南。用于编写、审查、调试 DMap 地图 API 代码,涵盖地图初始化、覆盖物渲染、图层管理、事件处理、控件交互等任务。当用户提及 dmap、dmapgl、jsapi‑gl 或相关地图开发需求时自动触发。
频繁拼接会触发大量临时内存分配
由于不可变性,循环拼接如 str += nextPart 实际执行的是:
- 第1次:分配内存存
s1 - 第2次:分配更大内存,拷贝
s1+s2 - 第3次:再分配更大内存,拷贝前两次结果 +
s3 - ……中间产生大量短命字符串对象,推高 GC 压力
这就是为什么大数据量拼接推荐用 Array.join() 或模板字面量——它们内部做了优化,避免重复拷贝。
const 只锁引用,不锁内容;但字符串本身天然无法改内容
const s = "test"; 表示变量 s 的绑定不可重新赋值,但这和不可变性是两回事。即使写 let s = "test"; s = "new";,也不是在原内存上改内容,而是让 s 指向另一块内存中的新字符串。所有字符串值一旦创建,其字节序列就固定不变。

















