必须用new调用的内置构造函数包括:date、regexp;array、object、function、number、string、boolean虽可不加new调用,但此时为类型转换而非实例化;symbol和bigint明确禁止new调用。

JavaScript 中 new 绑定在内置对象构造函数上的表现 与自定义构造函数基本一致,但存在关键差异:部分内置构造器对 new 的使用有强制要求或限制,且返回值逻辑更严格。它不是“可选语法糖”,而是某些内置类型实例化的必要路径。
哪些内置构造函数必须用 new
以下内置构造器只能通过 new 调用,否则会抛出 TypeError:
-
Date:直接调用Date()返回字符串;new Date()才返回日期对象 -
RegExp:不加 new 时返回正则字面量等效对象(兼容但非标准),但严格模式下会报错 -
Array、Object、Function、Number、String、Boolean:虽能不加 new 调用(如Number("123")),但此时是类型转换,返回原始值而非对象;只有new Number("123")才生成包装对象
new 绑定对内置构造函数的四步执行依然生效
即使面对 Array 或 Date,new 的底层机制不变:
- 创建空对象,继承自
Array.prototype或Date.prototype - 将该对象设为
this,执行内置初始化逻辑(如设置[[DateValue]]内部槽) - 原型链正确建立:
(new Date()).__proto__ === Date.prototype为 true - 若构造函数内部显式返回一个对象(极少见),则以该对象为准;否则返回新实例
包装类型是 new 绑定最典型的“陷阱区”
使用 new String("a")、new Number(42) 等会生成对象包装器,而非原始值:
- 它们拥有方法(如
.toUpperCase()),但typeof返回"object" - 与字面量比较时易出错:
new String("hello") == "hello"为 true,但===为 false - 现代开发中几乎从不使用这些包装对象,推荐直接用字面量(
"hello"、42)
例外:Symbol 和 BigInt 不支持 new
尽管它们是原始类型构造器,但规范明确禁止 new 调用:
-
new Symbol()→TypeError: Symbol is not a constructor -
new BigInt(123)→TypeError: BigInt is not a constructor - 它们的设计目标就是纯函数式调用:
Symbol("desc")、BigInt("123")
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











