构造函数返回原始值(如数字、字符串、布尔值、null、undefined、symbol、bigint)会被new完全忽略,仍返回新创建的实例;仅当返回引用类型(对象、数组、函数等)时,new才返回该对象并丢弃原实例。

构造函数返回原始值(如数字、字符串、布尔值、null、undefined、symbol、bigint)对 new 的行为没有实际影响——它会被完全忽略,new 仍返回新创建的实例对象。
new 的返回逻辑只看返回值是否为对象
JavaScript 引擎在 new 调用后,会严格按类型判断返回值:
- 返回引用类型(对象、数组、函数、正则、Date、RegExp 等)→
new表达式结果就是该返回值 - 返回任何原始值(包括
return 42、return "ok"、return true、return null、return undefined)→ 全部被忽略,new照常返回新实例 - 没写
return或只写return;→ 等价于return undefined,也属于原始值,同样被忽略
原始值返回不会破坏实例结构
即使你在构造函数里写了 return "hello",也不会导致:
-
this指向异常——this始终绑定到新创建的空对象上,属性赋值(如this.name = "Alice")照常生效 - 原型链断裂——实例仍继承构造函数的
prototype,instanceof和.constructor都正常 - 方法不可用——原型上的方法(如
Person.prototype.say())依然可调用
常见误判点:null 和 new String() 不是同一类
容易混淆的是:
-
return null是原始值 → 被忽略,返回实例 -
return new String("x")是对象(String 实例)→ 替代返回,原型链丢失 -
return "x"是原始字符串 → 安全,不影响 new 行为 - 验证技巧:
typeof val === "object" && val !== null或val instanceof Object(注意null是例外)
真正需要规避的是返回对象
只有显式返回引用类型才会改变 new 的语义:
- 返回
{}、[]、/./、new Date()等 → 实例被丢弃,instanceof失效,原型方法不可用 -
class构造器中若返回非对象,会直接抛出TypeError - 如需定制返回对象(如单例、代理),应改用工厂函数,而非依赖
new + return
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











