JavaScript字面量访问属性时自动装箱为临时包装对象,操作后立即销毁,不改变原始值;字符串、数字、布尔均为不可变原始类型,方法均返回新值;null和undefined无包装对象,调用方法会报错。

因为 JavaScript 引擎在访问字符串、数字或布尔字面量的属性或方法时,会自动执行“装箱”操作——临时创建对应的包装对象(如 String、Number、Boolean),在其原型上查找并调用方法,执行完立刻销毁该对象,不改变原始值本身。
装箱是隐式且瞬时的过程
引擎不会让字面量“变成对象”,而是每次访问时都新建一个包装实例,仅用于本次操作:
-
"abc".length→ 后台等价于new String("abc").length,读完即弃 -
42.toString()→ 先包装为new Number(42),调用toString,返回新字符串后对象消失 - 这个过程对开发者完全透明,也不可复用或持有
所有方法都返回新值,原值不可变
字符串、数字、布尔都是原始类型,天生不可修改:
-
"hello".toUpperCase()返回"HELLO",但"hello"本身没被改动 - 任何方法(如
slice、replace、toFixed)都不改变原始字面量,只生成新值 - 这也解释了为什么给字面量加属性无效:
let s = "a"; s.x = 1; console.log(s.x)输出undefined
手动创建包装对象需谨慎
用 new String("x") 等方式显式创建,得到的是真正的引用类型对象:
立即学习“Java免费学习笔记(深入)”;
-
typeof new String("x")是"object",不是"string" -
new String("x") === "x"返回false,类型不同 - 容易引发隐式转换陷阱,比如
if (new Boolean(false)) { ... }会进入分支(对象恒真)
只有三种基本类型有对应包装对象
String、Number、Boolean 提供了完整的包装能力;而 null 和 undefined 没有包装类型,也不能调用任何方法:
-
null.toString()报错TypeError -
undefined.toUpperCase()同样抛异常 - 这是语言设计上的明确边界,避免歧义


















