浏览器之争引起的JavaScript版本问题
-
网景公司:1995 年 8 月 Netscape Navigator2
1网景公司一位名叫 Brendan Eich 的工程师开发了一个叫 Mocha(后来改名为 LiveScript)脚本语言,计划在Netscape Navigator2 客户端和服务器端都使用它,服务端叫 Livewrite。后来网景与 Sun 公司结为开发联盟,共同完成 LiveScript 的开发。就在 Netscape Navigator 2 正式发布前,网景把 LiveScript 改名为 JavaScript,以便搭上媒体当时热烈炒作 Java 的顺风车。
-
微软:1996 年 8 月IE3
微软发布了 IE3,其中包含自己名为 JScript 的 JavaScript 实现。微软的 JavaScript 实现意味着出现了两个版本的 JavaScript:Netscape Navigator 中的 JavaScript,以 及 IE 中的 JScript。
-
JavaScript 标准化
1996年11月,Netscape 公司决定将 JavaScript 提交给国际标准化组织 ECMA(European Computer Manufacturers Association),JavaScript 踏上标准化的征程。
第 39 技术委员会(TC39) 承担了“标准化一门通用、跨平台、厂商中立的脚本语言的语法和语义”的任务。TC39 委员会由来自网景、Sun、微软、Borland、Nombas 和其他对这门脚本语言有兴趣的公司的工程师 组成。他们花了数月时间打造出 ECMA-262,也就是 ECMAScript(发音为“ek-ma-script”)这个新的脚 本语言标准。
1998 年,国际标准化组织(ISO)和国际电工委员会(IEC)也将 ECMAScript 采纳为标准(ISO/ IEC-16262)。自此以后,各家浏览器均以 ECMAScript 作为自己 JavaScript 实现的依据,虽然具体实现 各有不同。
JavaScript的实现
-
ECMASript
ECMAScript,即 ECMA-262 定义的语言,并不局限于 Web 浏览器。事实上,这门语言没有输入和 输出之类的方法。ECMA-262 将这门语言作为一个基准来定义,以便在它之上再构建更稳健的脚本语言。 Web 浏览器只是 ECMAScript 实现可能存在的一种宿主环境(host environment)。宿主环境提供 ECMAScript 的基准实现和与环境自身交互必需的扩展。扩展(比如 DOM)使用 ECMAScript 核心类型 和语法,提供特定于环境的额外功能。其他宿主环境还有服务器端 JavaScript 平台 Node.js 和即将被淘汰 的 Adobe Flash
-
BOM
IE3 和 Netscape Navigator 3 提供了浏览器对象模型(BOM) API,用于支持访问和操作浏览器的窗口。使用 BOM,开发者可以操控浏览器显示页面之外的部分。而 BOM 真正独一无二的地方,当然也是问题最多的地方,就是它是唯一一个没有相关标准的 JavaScript 实现。HTML5 改变了这个局面,这个版本的 HTML 以正式规范的形式涵盖了尽可能多的 BOM 特性。由于 HTML5 的出现,之前很多与 BOM 有关的问题都迎刃而解了。 总体来说,BOM 主要针对浏览器窗口和子窗口(frame),不过人们通常会把任何特定于浏览器的 扩展都归在 BOM 的范畴内。比如,下面就是这样一些扩展:
- 弹出新浏览器窗口的能力
- 移动、缩放和关闭浏览器窗口的能力
- navigator 对象,提供关于浏览器的详尽信息;
- location 对象,提供浏览器加载页面的详尽信息
- screen 对象,提供关于用户屏幕分辨率的详尽信息
- performance 对象,提供浏览器内存占用、导航行为和时间统计的详尽信息
- 对 cookie 的支持
- 其他自定义对象,如 XMLHttpRequest 和 IE 的 ActiveXObject
因为在很长时间内都没有标准,所以每个浏览器实现的都是自己的 BOM。有一些所谓的事实标准, 比如对于 window 对象和 navigator 对象,每个浏览器都会给它们定义自己的属性和方法。现在有了 HTML5,BOM 的实现细节应该会日趋一致。
-
DOM
文档对象模型(DOM,Document Object Model)是一个应用编程接口(API),用于在 HTML 中使用扩展的 XML。DOM 将整个页面抽象为一组分层节点。HTML 或 XML 页面的每个组成部分都是一种节点,包含不同的数据
ECMAScript 版本
ECMA-262 就是 ECMA 262 号标准,具体就是指 ECMAScript 遵照的标准
| 版本号 | 别名 | 发布时间 | 修改内容 |
|---|---|---|---|
| ECMA-262 第 1 版 | 1997.06 | ECMA-262 的第 1 版本质上跟网景的 JavaScript 1.1 相同, 只不过删除了所有浏览器特定的代码,外加少量细微的修改 | |
| ECMA-262 第 2 版 | 1998.06 | ECMA-262 第 2 版只是做了一些编校工作,主要是为了更新之后严格符合 ISO/IEC-16262 的要求, 并没有增减或改变任何特性。 | |
| ECMA-262 第 3 版 | 1999.12 | ECMA-262 第 3 版第一次真正对这个标准进行更新,更新了字符串处理、错误定义和数值输出。此外还增加了对正则表达式、新的控制语句、try/catch 异常处理的支持,以及为了更好地让标准国际化 所做的少量修改。 | |
| ECMA-262 第 4 版 | 被弃用 | 第 4 版包 括强类型变量、新语句和数据结构、真正的类和经典的继承,以及操作数据的新手段。几乎在第 3 版基础上完全定义了一门新语言。 | |
| ECMA-262 第 5 版 | 2009.12 | ECMAScript 3.1 与ECMAScript 4同时提出,只对这 门语言进行了较少的改进,后来变成了 ECMA-262 的第 5 版。 | |
| 2011.06 | 维护性修订版,只更正了规范中的错误,并未增加任何新的语言 或库特性。 | ||
| ECMA-262 第 6 版 | ES6、ES2015 、 ES Harmony(和谐版) | 2015.06 | 包含了大概这个规范有史以来最重要的一批增强特性。ES6 正式支持了类、模块、迭代器、生成器、箭头 函数、期约、反射、代理和众多新的数据类型。 TC39 委员会计划以后每年 6 月发布一个 ECMAScript 的版本,下一个版本在2016年发布,称为“ECMAScript 2016”,2017年发布“ECMAScript 2017”,以此类推。 |
| ECMA-262 第 7 版 | ES7、ES2016 | 2016.06 | 包含少量语法层面的 增强,如 Array.prototype.includes 和指数操作符。 |
| ECMA-262 第 8 版 | ES8、ES2017 | 2017.06 | 增加了异步函数(async/ await)、SharedArrayBuffer 及 Atomics API,以及 Object.values()/Object.entries()/Object. getOwnPropertyDescriptors()和字符串填充方法,另外明确支持对象字面量最后的逗号。 |
| ECMA-262 第 9 版 | ES9、ES2018 | 2018.06 | 异步迭代、剩余和 扩展属性、一组新的正则表达式特性、Promise finally(),以及模板字面量修订。 |
| ECMA-262 第 10 版 | ES10、ES2019 | 2019.06 | 增加了 Array.prototype. flat()/flatMap()、String.prototype.trimStart()/trimEnd()、Object.fromEntries()方 法,以及 Symbol.prototype.description 属性,明确定义了 Function.prototype.toString() 的返回值并固定了 Array.prototype.sort()的顺序。这次修订解决了与 JSON 字符串兼容的 问题,并定义了 catch 子句的可选绑定。 |
参考链接
-
JavaScript 高级程序设计(第四版)第一章 什么是JavaScript(大量搬运)