Object()对原始值转换:字符串/数字/布尔→对应包装对象,null/undefined→空对象{},Symbol/BigInt也生成包装对象;但不推荐滥用,因易引发类型混淆和隐式转换陷阱。

JavaScript 中用 Object() 函数对原始值进行显式转换,本质是调用其对应的包装对象构造函数,生成一个“对象包装器”。但要注意:它不会把所有原始值都转成你直觉中的“对象”,行为因类型而异,且 null 和 undefined 是特例。
字符串、数字、布尔值:转为对应包装对象
对 string、number、boolean 这三类原始值调用 Object(),会分别返回 String、Number、Boolean 构造函数创建的实例(即包装对象):
-
Object("abc")→String { "abc" }(不是普通对象,是String实例) -
Object(42)→Number { 42 } -
Object(true)→Boolean { true }
这些包装对象继承各自原型上的方法(如 .toUpperCase()、.toFixed()),但注意它们的 typeof 是 "object",且与字面量不全等(Object("a") === "a" 为 false)。
null 和 undefined:转为空对象 {}
这是最容易忽略的关键点:Object(null) 和 Object(undefined) 都返回一个**空的普通对象**(即 {}),而不是报错或保持原样:
立即学习“Java免费学习笔记(深入)”;
-
Object(null)→{} -
Object(undefined)→{}
这个行为源于规范定义:当参数为 null 或 undefined 时,Object() 直接执行 ObjectConstructor()(无参调用),等价于 new Object()。
Symbol 和 BigInt:也生成包装对象(ES6+)
ES6 引入 Symbol 后,Object(Symbol('a')) 返回 Symbol 包装对象;ES2020 起,Object(1n) 返回 BigInt 包装对象:
-
Object(Symbol('x'))→Symbol { Symbol(x) } -
Object(123n)→BigInt { 123n }
它们同样具有对应原型方法(如 Symbol.prototype.description),但日常极少需要手动包装。
为什么不推荐频繁使用 Object() 做显式包装?
现代 JavaScript 中,原始值在需要方法时会自动临时包装(如 "abc".length),无需手动干预。显式调用 Object() 容易带来意外:
- 混淆类型判断(
typeof Object("") === "object",但"" instanceof String === false) - 引发隐式转换陷阱(如
Object(false) == false为true,但Object(false) === false为false) -
null/undefined的特殊处理可能掩盖逻辑错误
若真需对象语义,更清晰的做法是用字面量或构造函数明确表达意图,例如 new String("a") 或直接操作原始值。


















