flowers
一次彻底搞懂ECMAScript、DOM、BOM(通俗易懂版)【重嗑JS系列-Basic】
一次彻底搞懂ECMAScript、DOM、BOM(通俗易懂版)【重嗑JS系列-Basic】

2021.07.0410 min read

原创声明:未经允许,禁止转载

JavaScript诞生之初仅仅是为了处理一些简单的输入验证操作,在那之前,浏览器上的表单简单验证都需要发送给服务器端处理(想象你辛辛苦苦填了一整个表单,提交以后过了30秒服务器返回消息说你有一个必填文本框没填...)。网景公司(Netscape)开发了这门语言试图解决这个问题。

如今JavaScript已然出乎所有人意料地发展成了一门强大的语言。然而就像任何事物的成功大都不是一蹴而就的,JavaScript也曾面临它的困境和挑战。


什么是 ECMAScript

在网景家的JavaScript初步取得成功之后,微软也跟风在自家IE里推出了名为JScript的JavaScript实现(取名JScript是为了避官司)。这意味着JavaScript的版本开始出现分歧:网景家的JavaScript和IE的JScript。为了避免分歧的加剧,这时候业界急需对JavaScript的语法和特性进行权威标准化。(想象你要为不同的浏览器开发不同的Web程序的可怕局面...)

于是“ECMAScript新脚本语言规范”就应运而生,这是由欧洲计算机制造商协会(ECMA)在他们历经数月完成的。ECMA-262 规范里定义的一种“通用的、跨平台、供应商中立”的脚本语言的语法和语义标准, 自此以后,各大浏览器开发商就不得不基于ECMAScript中定义的标准来开发各自的JavaScript实现。这也一定程度上延长了Web程序员的平均寿命(雾)。

ECMAScript的版本:

ECMAScript从第三版开始才算是标准意义上的第一次更新。它提供了对字符串处理、错误定义和数字输出的更新。它还增加了对正则表达式、新控制语句、try-catch 异常处理的支持,还进行了一些小改动以更好地为国际化标准做好准备。对许多人来说,这标志着 ECMAScript 作为一种真正的编程语言的到来。

第四版对ECMAScript语言进行了一次大检修。为了响应JavaScript在Web上的流行,开发人员开始修改ECMAScript以满足全球Web开发不断增长的需求。由此产生的规范定义了一种基于第三版的几乎全新的语言。第四版包括强类型变量、新语句和数据结构、真正的类和经典继承,以及与数据交互的新方法。然而因为跨度实在是太大了,最终第四版在正式发布前被放弃。。。取而代之的是一个名为ECMAScript 3.1 的替代性建议,该方案只对这门语言进行了较少的改进,因而能够在现有的JavaScript引擎基础上进行实现。为了区别于第四版,这个版本就直接成为了ECMA-262第5版,并于2009年12月正式发布。新功能包括原生JSON对象(用于解析和序列化JSON数据)、继承的方法和高级属性定义。第五版于 2011 年 6 月进行了小规模的维护修订。

第六版(通俗地称为 ES6、ES2015 或 ES Harmony)于 2015 年 6 月发布,可以说是该规范自成立以来最重要的增强集合。 ES6 添加了对类、模块、迭代器、生成器、箭头函数、promise、反射、代理和大量新数据类型的正式支持。

第七版,称为 ES7 或 ES2016,于 2016 年 6 月发布。此修订版仅包含少量语法添加,例如 Array.prototype.includes 和取幂运算符。

第八版,称为 ES8 或 ES2017,于 2017 年 1 月定稿。此修订版包括异步迭代、rest 和 spread 属性、新的正则表达式功能集合、Promise finally() catchall 处理程序和模板字面量修订。

ECMAScript最新已经到了第9版,仍在定稿中,但它已经拥有大量功能。其最重要的新增功能可能就是 ES6 模块的动态导入了。

ECMAScript和脚本语言(如JavaScript)的关系

虽然JavaScript和ECMAScript往往被混为一谈,但其实JavaScript的内容要比仅仅在ECMA-262里定义的ECMAScript要多得多。它包含以下三个部分:

  • 核心(ECMAScript)
  • 文档对象模型(DOM)
  • 浏览器对象模型(BOM)

ECMAScript它仅仅定义了一种脚本语言的基础。其他更健壮和完善的脚本语言(比如JavaScript)可以依据此基础进行构建。那么它都规定了些啥?大致是以下部分:

  • 句法
  • 类型
  • 声明
  • 关键词
  • 保留字
  • 运算符
  • 全局对象

除了JavaScript, 其他实现了ECMAScript的脚本语言还有Adobe ActionScript(一种可用于网页制作和Flash小动画开发的脚本语言,由于诸多复杂原因已经没落了,详细可参看知乎这个问题).

ECMAScript和浏览器的关系

ECMA-262中定义的ECMAScript并不是和哪家浏览器绑定的,Web浏览器仅仅是依据ECMAScript实现的脚本语言的可能的宿主环境之一。该宿主环境不仅提供基础的ECMAScript实现, 也提供作为环境本身接口的脚本语言实现的扩展。这些扩展,比如文档对象模型(DOM),使用了ECMAScript的核心类型和句法来提供更适应于具体环境的附加功能。

其他宿主环境包括 NodeJS(一种服务端JavaScript平台)和 Adobe Flash(已经没落)。

一张图搞懂 ECMAScript、JavaScript和浏览器的关系 ECMAScript(cn)

什么是ECMAScript兼容

做到与ECMA-262中描述的ECMAScript兼容,一个语言实现得达到以下要求:

  • 支持ECMA-262所描述的所有“类型、值、对象、属性、函数和程序句法及语义”
  • 支持Unicode(万国码)字符标准

另外,一个与ECMAScript兼容的语言实现还可以进行以下扩展(非必须):

  • 添加ECMA-262中没有描述的“更多类型、值、对象、属性、函数和函数”。
  • 支持ECMA-262中没有定义的“程序和正则表达式”(即是说可以对内置的正则表达式语法进行修改和扩展)

这些标准给了给予ECMAScript进行新脚本语言实现的开发者巨大的动力和灵活性,也从侧面解释了ECMAScript为什么受欢迎。


什么是 DOM

DOM是文档对象模型(Document Object Model)的简称,是一个针对XML的应用程序编程接口,它为适用于HTML进行了扩展。 DOM把整个页面映射为节点的层次结构。HTML或XML的每个组成部分都是某种包含各类数据的节点。

通过为文档创建树形结构,DOM使得程序员能够前所未有地控制页面的内容和结构。节点可以通过DOM API被轻易地删除、添加、替代和修改。

为什么要有DOM,以及W3C干了啥?

又说回到了网景和微软的浏览器之争, IE4和网景导航4浏览器分别支持不同形式的动态HTML(DHTML),虽然开发人员首次可以无需刷新页面就能更改页面的外观和内容了,但是,这两家的浏览器发展各持己见已然是完全不同的两个派别,这样下去开发人员又不得不为各浏览器开发各自兼容的web应用来维持应用的跨平台性。程序员又得加班了。。。

于是W3C出场了,着手规划DOM。

W3C是干嘛的? W3C:World Wide Web Consortium(万维网联盟)的简称。万维网联盟是一个负责制定Web通信标准的组织,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。到目前为止,W3C已发布了200多项影响深远的Web技术标准及实施指南。

DOM的级别
  1. DOM 1级
  • DOM 核心 提供了一种映射基于XML的文档结构的办法,以便对文档的任何部分进行访问和操作。
  • DOM HTML 在DOM核心的基础上进行了扩展,增加了针对HTML的对象和方法。
  1. DOM 2级 (更加广泛)
  • 在原DOM的基础上提供了对鼠标和用户界面事件、范围、遍历(迭代DOM文档的方法)的支持

  • 通过对象接口对层叠样式(CSS)的支持

  • 扩展DOM核心以提供对XML命名空间的支持

  • 引入以下新模块来应对新的类型和接口

    1. DOM视图(DOM Views) —— 描述用于跟踪不同文档视图的接口(比如应用了CSS样式前后的文档)
    2. DOM事件(DOM Event) —— 描述了事件和事件处理的接口
    3. DOM式样(DOM Style) —— 描述了处理基于CSS元素样式的接口
    4. DOM遍历(DOM Traversal and Range) —— 描述了用于遍历和操作文档树的接口
  1. DOM 3级
  • 用统一的方式加载和保存文档的方法(包含于一个叫做DOM加载和保存的新模块)
  • 用于验证文档的方法(DOM 验证)
  • 对DOM核心进行扩展以支持所有XML1.0(包括XML Infoset、XPath 和 XML Base)

注意⚠️:当前W3C不再以DOM级别的形式来维护DOM, 而是作为“DOM现存标准(DOM Living Standard)”.

其他DOM标准

除了上面的DOM核心和DOM HTML接口,还有其他基于XML的语言,它们都发布了只针对自己DOM的标准。而且每种DOM标准都增加了只属于它们自己语言的独特的方法和接口:

  • SVG(Scalable Vector Graphic,可伸缩矢量图)1.0;
  • MathML(Mathematical Markup Language,数学标记语言)1.0;
  • SMIL(Synchronized Multimedia Integration Language,同步多媒体集成语言)。

Web 浏览器对 DOM 的支持

在浏览器开始实现对DOM的支持以前,DOM作为标准已经存在了很长时间了。然而实现对DOM的支持终究是条漫漫长路。现在,提供DOM支持对各大浏览器提供商而言都是具有极高优先级的task,每次新浏览器的发布都在不断提升对DOM的支持。发展至今,各大浏览器基本都实现了对DOM1级和2级的支持,只有IE9+和Edge提供了DOM3级的完整支持,其他浏览器(如Chrome 1+, Safari 2+, Firefox 1+等)都是部分支持DOM3级。


什么是 BOM

BOM(Browser Object Model)浏览器对象模型,是用于支持访问和操作浏览器窗口的接口。 通过BOM,程序员可以与显示页面以外的浏览器部分进行交互。

基本上,BOM和浏览器窗口和框架打交道, 但是人们普遍把任何针对浏览器的JavaScript扩展都看作是BOM的一部分:

  • 弹出新窗口功能
  • 移动,调整大小,关闭浏览器窗口
  • 提供浏览器详细信息的 navigator 对象
  • 提供浏览器所加载页面的详细信息的 location 对象
  • 提供用户显示器分辨率详细信息的 screen 对象
  • 提供有关浏览器内存消耗、导航行为和计时统计的详细信息的 performance 对象
  • 对 cookies 的支持
  • 像 XMLHttpRequest 和 IE 的 ActiveXObject 这样的自定义对象

小结

可见 ECMAScript,DOM和BOM 都是JavaScript的不可缺少的一个部分。

ECMAScript(由ECMA-262定义的脚本语言标准)提供了核心功能的定义,DOM提供了与网页内容进行交互的接口,BOM则定义了与浏览器进行交互的接口。


参考: Matt Frisbie - Professional JavaScript for Web Developers-Wrox Press