内置对象是ECMAScript标准定义、随环境自动存在且无需手动构造的对象,如Array、Date、Math;自定义对象由开发者显式创建,无标准语义约束,constructor.name和toString.call结果可可靠区分二者。

区分内置对象和自定义对象,关键看它是不是 JavaScript 语言标准(ECMAScript)本身定义的、随环境自动存在、无需手动构造就能直接使用的对象。
看创建方式是否需要 new 或字面量定义
内置对象通常可直接调用,不依赖 new(如 Math.max()、Date.now()),部分虽支持构造(如 new Date()),但本质是规范预置的;自定义对象必须由开发者显式创建——用构造函数加 new、对象字面量 {}、或 class 定义后实例化。
-
Array.isArray([])→ 内置:方法属于 Array 构造器,本身是规范定义的 -
const user = { name: 'Alice' };→ 自定义:纯开发者声明,无标准语义约束 -
class Car {} const c = new Car();→ 自定义:类由你定义,实例也由你控制
看 constructor.name 和 toString.call 的返回值
这是最可靠的运行时判断方式:
- 内置对象(如
new Date()、[1,2])调用Object.prototype.toString.call(obj)会返回[object Date]或[object Array] - 自定义对象(哪怕用
function Person(){}创建)默认返回[object Object],除非重写toString -
obj.constructor.name对内置对象返回准确名称("Date"、"Array");对多数自定义对象返回构造函数名(如"Person"),但若用字面量创建,constructor是Object
看是否属于 ECMAScript 规范明确定义
内置对象有明确规范出处,比如:
- ECMA-262 标准列出的本地对象:
Object、Array、Date、RegExp、Promise、Map、Set等 - 全局对象:
Math、JSON、Reflect—— 它们不是构造器,不可new,但也是内置对象 - 自定义对象不在规范中,名字、结构、行为全由开发者决定,JS 引擎不提供默认实现
注意宿主对象不是内置对象
容易混淆的是 window、document、fetch 这类 —— 它们来自浏览器环境(宿主),不是 JavaScript 语言本身的内置对象。它们在 Node.js 中不存在,在其他 JS 环境(如 Deno、WebWorker)中表现也可能不同。而 Array、String 在任何标准 JS 环境中都可用。

















