JavaScript字符串不可变,即所有操作均返回新字符串而不修改原值:toUpperCase()、replace()等不改变原串;s[0]="x"静默失败;s+="world"实为重新赋值;字面量和String()创建原始值,new String()应避免。
javascript 中 string 类型的不可变性,不是“不能操作”,而是任何看似修改的操作,都不会改变原有字符串本身——它始终返回一个新字符串,原值纹丝不动。
所有方法都返回新字符串,不改原值
调用 .toUpperCase()、.replace()、.slice()、.trim() 等方法时,原始字符串内容完全不受影响:
-
let s = "hello"; s.toUpperCase();→s还是"hello",返回的是"HELLO" -
s.replace("e", "a");→ 原s不变,新字符串为"hallo" - 即使
s += " world",本质也是s = s + " world",即创建新字符串并重新赋值给s
无法通过索引直接修改字符
尝试用下标赋值会静默失败(非严格模式)或报错(严格模式):
let s = "abc"; s[0] = "x"; console.log(s); // 输出 "abc"-
s.length是只读属性,不能手动设为其他值 - 没有
.push()、.pop()或类似数组的原地修改方法
变量赋值只是重指向,不是改内容
let s = "a" 中的 s 是对字符串值的引用;s = "b" 并非把内存里那个 "a" 改成 "b",而是让 s 指向另一个新字符串:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 原
"a"仍驻留在内存中,直到无引用被回收 - 多个变量若初始赋相同字面量(如
let a = "hi"; let b = "hi"),引擎可能共享同一内存实例(常量池优化) - 但无论是否共享,谁都无法篡改它——这是不可变性的根本保障
创建方式也强化不可变语义
推荐用字面量('text'、"text"、`text`)或 String(123),它们生成的是原始字符串值;而 new String("text") 返回包装对象,破坏了不可变性在类型系统中的自然表现,容易引发 === 判断异常,应避免使用。
立即学习“Java免费学习笔记(深入)”;

















