字面量返回原始类型名,构造函数创建对象且typeof返回"object",严格相等比较时类型不同必为false,原始值不可扩展属性,包装对象可添加属性但易引发逻辑错误。

直接看 typeof 和 === 就能快速区分:字面量返回原始类型名(如 "string"、"number"),而构造函数创建的是对象,typeof 返回 "object",且与同值字面量严格不等。
看 typeof 结果
这是最直观的第一步:
-
typeof "hello"→"string" -
typeof new String("hello")→"object" -
typeof 42→"number" -
typeof new Number(42)→"object" -
typeof true→"boolean" -
typeof new Boolean(true)→"object"
null 和 undefined 没有对应构造函数,typeof null 虽然错误地返回 "object",但它仍是原始值;typeof undefined 正确返回 "undefined"。
用 === 做严格相等判断
原始值按值比较,包装对象按引用比较:
立即学习“Java免费学习笔记(深入)”;
-
"abc" === new String("abc")→false(类型不同) -
123 === new Number(123)→false -
true === new Boolean(true)→false -
new String("a") === new String("a")→false(两个独立对象)
注意:== 会触发隐式转换,可能返回 true,但那掩盖了本质差异,不能用于判别。
检查能否添加属性
原始值不可变、不可扩展;包装对象是真正的对象,支持动态属性:
-
let s = "hi"; s.temp = 1; console.log(s.temp)→undefined -
let sObj = new String("hi"); sObj.temp = 1; console.log(sObj.temp)→1
这个操作背后是自动装箱机制:访问字面量属性时,JS 临时创建包装对象,取完即销毁,无法持久保留修改。
留意布尔和数值包装对象的陷阱
它们容易引发逻辑错误,是区分时的关键警示点:
-
if (new Boolean(false)) { ... }会执行——因为对象永远为真值 -
if (false) { ... }不执行——这才是预期行为 -
typeof new Number(0)是"object",可能破坏类型判断逻辑 -
Array.isArray(new Number(5))→false,但Array.isArray([])→true,说明它不是数组,也不是原始值
真正需要包装对象的场景极少,比如调试时观察内部结构,或显式要求“非原始值”语义——日常开发中应始终优先使用字面量。


















