You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript内置对象、原生对象与宿主对象的区别及分类正确性咨询

JavaScript对象分类:内置、原生、宿主到底怎么分?

嘿,这个问题问得特别戳痛点——JS里的对象分类确实因为不同的民间表述容易搞混,我来给你掰扯清楚,先从权威规范说起,再拆解你提到的两种表述:

先看ECMAScript规范的官方定义

这是所有术语的基准,不能乱:

  • 原生对象(Native Object):由ECMAScript规范定义、和宿主环境无关的对象。简单说就是JS语言本身自带的,不管你在浏览器还是Node.js里跑,这些对象的行为都是规范规定好的。比如Object、Array、String、Function、Date、RegExp、Math、Error,还有全局对象(比如浏览器里window的核心语言部分)都属于这类。
  • 内置对象(Built-in Object):是原生对象的一个子集——特指在脚本刚启动执行时就已经存在的原生对象。比如全局对象本身,还有它身上的Object、Array这些构造函数,都是内置对象。日常开发里我们常把“内置对象”和“原生对象”混用,但严格来说内置是原生的一部分。
  • 宿主对象(Host Object):由JS运行的宿主环境(浏览器、Node.js、微信小程序运行时等)提供的对象,不属于ECMAScript规范的范畴。比如浏览器里的window(除了核心语言部分)、document、location、XMLHttpRequest、setTimeout,Node.js里的process、fs模块等。

你提到的两种表述对错分析

第一种表述:基本正确,符合日常开发语境

第一种表述把JS对象分为「原生对象+宿主对象」,然后把“内置对象”作为原生对象里的核心成员(ECMAScript定义的语言组成部分)来举例——这完全没问题,甚至是日常开发里最常用的表述方式。因为大家平时说“内置对象”,就是指那些JS语言自带的、一开始就有的原生对象,而宿主对象就是环境给的额外对象,这个逻辑和规范一致,只是把原生对象里的内置子集单独拎出来强调了,非常实用。

第二种表述:完全错误,术语搞反了

第二种表述说“原生对象是浏览器提供的,宿主对象是用户创建的”——这纯粹是把术语搞混了!用户自己创建的对象一般叫自定义对象或者用户定义对象,和“宿主对象”八竿子打不着。而原生对象的定义和宿主环境无关,是JS语言本身的东西,所以这个表述完全不符合规范,也不符合行业共识,绝对不能用。

关于宿主对象的细分

如果要对宿主对象细分,绝对不能用第二种表述的方式,而是要基于宿主环境提供的类型来分,比如:

  • 浏览器环境下的宿主对象可以分成:
    • BOM对象:window、location、history、navigator
    • DOM对象:document、Element、NodeList、XMLHttpRequest
    • 宿主提供的全局API:setTimeout、fetch、querySelectorAll
  • Node.js环境下的宿主对象则包括:process、Buffer、fs模块、http模块等

总结一下:第一种表述的核心逻辑是对的,是行业常用的说法;第二种表述完全混淆了术语,是错误的。宿主对象的细分要基于环境提供的类型,和用户创建的对象没关系。

内容的提问来源于stack exchange,提问作者jini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:12:42