原始类型字面量与包装对象本质不同:前者是不可变原始值,后者是可变对象实例;42 === new number(42) 为 false,因类型不同;字符串方法调用依赖自动装箱;new boolean(false) 是真值,属常见陷阱;null 和 undefined 无构造函数且不可装箱。

原始类型字面量(如 42、"hello"、true)和用构造函数创建的包装对象(如 new Number(42)、new String("hello")、new Boolean(true))本质不同:前者是不可变的原始值,后者是可变的对象实例,行为和用途差异显著。
值类型 vs 引用类型
字面量直接生成原始值,存储在栈中,比较时按值相等;构造函数返回的是包装对象,属于引用类型,存在堆内存中,即使内容相同也 === 不等:
-
42 === new Number(42)→ false(类型不同:number vs object) -
new Number(42) == 42→ true(抽象相等会隐式转换) -
new String("a") === new String("a")→ false(两个独立对象)
自动装箱与方法调用机制
原始值本身没有方法,但 JavaScript 在访问属性或方法时会临时包装成对应对象(自动装箱),操作完立即销毁:
-
"hello".toUpperCase()实际是:new String("hello").toUpperCase()(临时对象) -
let s = "hello"; s.temp = "x"; console.log(s.temp)→ undefined(原始值不能持久添加属性) -
let sObj = new String("hello"); sObj.temp = "x"; console.log(sObj.temp)→ "x"(对象可赋值)
构造函数的使用场景与风险
绝大多数情况下应避免用 new Number/new String/new Boolean 创建对象:
- 布尔包装对象:
new Boolean(false)是真值(因为对象非空),导致if (new Boolean(false)) {...}执行分支 —— 这是常见陷阱 - 数值包装对象:
typeof new Number(5)返回"object",破坏类型判断逻辑 - 唯一合理用途:需要显式区分原始值与对象(极少见),或调试时观察包装对象结构
特殊注意:null 和 undefined 没有构造函数
它们是原始值,且没有对应的包装构造函数:
-
new Null()或new Undefined()会抛出ReferenceError -
typeof null返回"object"是历史遗留 bug,但null仍是原始类型 - 它们无法被装箱,访问属性(如
null.x)直接报TypeError











