JavaScript字符串不可变,即创建后内容无法修改,所有操作均生成新字符串而非修改原串;如索引赋值无效、方法不改变原串、拼接截取替换等均返回新串,变量仅指向不同字符串对象。

JavaScript 中字符串的不可变性,意思是:一旦字符串被创建,它的内容就固定了,不能被修改。你不是在“改”它,而是在“换”它——每次操作都生成一个新字符串,原字符串毫发无损。
为什么说字符串不可变?
因为字符串是原始类型(primitive),底层实现决定了它无法被原地编辑。比如:
不能通过索引赋值:
let str = "abc";
str[0] = "x"; // 无效操作
console.log(str); // 还是 "abc"
所有方法都不动原串:
let s = "hello";
s.toUpperCase(); // 返回 "HELLO",但 s 仍是 "hello"
s.replace("l", "z"); // 返回 "hezlo",s 没变
常见操作的本质其实是“新建”
看似在修改,实则都在创建新字符串:
- 拼接:s + " world" 或 s.concat(" world") → 新字符串
- 截取:s.slice(0, 3) 或 s.substring(1, 4) → 新字符串
- 替换:s.replace(/a/g, "A") → 新字符串(原串不变)
- 分割再合并:s.split("").reverse().join("") → 三步新建,最终一个新串
实际开发中要注意什么?
不可变性带来安全性和可预测性,但也影响性能:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 频繁拼接长字符串(比如循环中 +=)会反复创建新对象,拖慢速度 → 改用数组 push + join
- 想“删掉最后一个字符”,别想着 str.pop()(字符串没这个方法),而是用 str.slice(0, -1)
- 函数式编程友好:传入字符串不用担心被意外改写,适合纯函数和状态管理场景
- 内存里旧字符串若不再被引用,会由垃圾回收器清理,不用手动干预
怎么验证不可变性?
最直接的方式是对比引用或观察变量指向:
let a = "test";
let b = a;
a = a + "123"; // a 指向新字符串
console.log(a); // "test123"
console.log(b); // "test" —— b 还指着原来的
这说明变量只是“标签”,真正存储在内存里的字符串本体,从不改变。

















