一次彻底搞懂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兼容
做到与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的级别
- DOM 1级
- DOM 核心 提供了一种映射基于XML的文档结构的办法,以便对文档的任何部分进行访问和操作。
- DOM HTML 在DOM核心的基础上进行了扩展,增加了针对HTML的对象和方法。
- DOM 2级 (更加广泛)
在原DOM的基础上提供了对鼠标和用户界面事件、范围、遍历(迭代DOM文档的方法)的支持
通过对象接口对层叠样式(CSS)的支持
扩展DOM核心以提供对XML命名空间的支持
引入以下新模块来应对新的类型和接口
- DOM视图(DOM Views) —— 描述用于跟踪不同文档视图的接口(比如应用了CSS样式前后的文档)
- DOM事件(DOM Event) —— 描述了事件和事件处理的接口
- DOM式样(DOM Style) —— 描述了处理基于CSS元素样式的接口
- DOM遍历(DOM Traversal and Range) —— 描述了用于遍历和操作文档树的接口
- 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