一文读懂JavaScript和ECMAScript的区别

一文读懂JavaScript和ECMAScript的区别

这篇文章表明了我目前对 JavaScript 和 ECMAScript 之间差别的理解。文章适合那些熟悉 JavaScript 但又想更加清楚地了解其与 ECMAScript、web 浏览器、Babel 等是何种关系的人。你还会额外了解到脚本语言、JavaScript 引擎以及 JavaScript 运行时。前端

做者:OSC - 协做翻译来源:开源中国|2017-11-13 11:31程序员

一文读懂JavaScript和ECMAScript的区别

我曾试着在谷歌上检索 “ JavaScript 和 ECMAScript 之间的区别。”web

最后我在获得的海量的混淆不清又相互矛盾的结果中完全绝望了:正则表达式

“ECMAScript 是标准。”编程

“JavaScript 是标准。”浏览器

“ECMAScript 是规范。”服务器

“JavaScript 是 ECMAScript 标准的实现。”前端优化

“ECMAScript 是标准化的 JavaScript。”编程语言

“ECMAScript 是一门语言。”ide

“JavaScript 是 ECMAScript 的一个分支。”

“ECMAScript 是 JavaScript。”

忍住,别哭。我强打精神决定作一些痛苦但却有成果的研究。

这篇文章表明了我目前对 JavaScript 和 ECMAScript 之间差别的理解。文章适合那些熟悉 JavaScript 但又想更加清楚地了解其与 ECMAScript、web 浏览器、Babel 等是何种关系的人。你还会额外了解到脚本语言、JavaScript 引擎以及 JavaScript 运行时。

那么,打起精神来吧。

JavaScript/ECMAScript 词汇表

下面是一系列的定义,设计的侧重点在于一致性和清晰性。定义并不是百分比完整。它们被设计从宏观的的层面对 JavaScript 和 ECMAScript 之间的联系和关系给出了说明。

闲话少叙,让咱们开始吧。

Ecma International

一个为科学技术制定标准的组织。

为了要举一个“标准”的例子(尽管并不是由 Ecma 所发明),能够用咱们曾用过的键盘来讲明。是否是大多数的字母以一样的顺序排列,有一个空格键、一个输入键、箭头键,并将数字显示在最上面的一行?这是因为大多数键盘制造商的键盘设计是基于 QWERTY 布局标准的。

ECMA-262

这是由 Ecma 国际发布的标准。它包含通用目的的脚本语言的规范。

ECMA-262 是一个相似 QWERTY 的标准,但不一样于呈现一个键盘层的规范,它呈现了被称为 ECMAScript 的脚本语言规范。

能够把 ECMA-262 当作 ECMAScript 的参考数字。

脚本语言

一种专门为在一种存在的实体或系统上操做而设计的编程语言。

关于如何使编程语言成为脚本语言的常规想法,请考虑命令“walk”、“run” 和 “jump”。这些操做须要一些东西来驱动,多是一我的、一条狗或一个视频游戏角色。若是没有操做员来执行这些命令,“walk”、“run” 和 “jump” 是没有意义的。这组操做相似于专一于操纵外部实体的脚本语言。

ECMAScript

The specification defined in ECMA-262 中定义的标准,是用于建立通用目的脚本语言的。

同义词: ECMAScript 规范

然而ECMA-262是标准的名称,它表明了脚本语言规范ECMAScript。

ECMAScript提供脚本语言必须遵照的规则、细节和准则,这些才是其被视为兼容ECMAScript的判断标准。

JavaScript

一种通用目的的脚本语言,遵循 ECMAScript 规范。

它是 ECMAScript 语言的一个分支版本。

JavaScript 是我喜欢编程的咖啡味语言(指代 Java 族,译者注)。ECMAScript 是它所基于的规范。经过阅读 ECMAScript 规范,你将学会如何建立脚本语言。经过阅读 JavaScript 文档,你将学习如何使用脚本语言。

当人们把 JavaScript 称为“ ECMAScript 语言的方言”的时候,他们的意思就像谈论英语、法语或者中国方言时同样。一种方言从其母语中衍生出大部分的词汇和语法,但偏离得值得保留这些差别。

JavaScript 实现了多数 ECMA-262 中描述的 ECMAScript 规范,但存在少数差别。 Mozilla 在此概述了 JavaScript 的非 ECMAScript 语言功能:

JavaScript 引擎

可以理解和执行 JavaScript 代码的程序或解释器。

同义词:JavaScript 解释器,JavaScript 的实现

JavaScript 引擎一般能够在 web 浏览器中被发现,包括 Chrome 中的 V8 ,火狐中的 SpiderMonkey ,以及 Edge 中的 Chakra 。每款引擎就像是一个用于其应用程序的语言模块,可让其支持某种 JavaScript 语言的分支。

JavaScript 引擎对于浏览器来讲就像是人类对语言的理解同样。若是咱们从新拿咱们平常行为中的“走”、“跑”、“跳”来举例的话,一个 JavaScript 引擎是真正可以理解这些动做是何意义的根本机制。

这个比喻能够帮咱们解释一些关于浏览器的事情:

浏览器性能的差别

两我的也许会识别“跳”的命令,可是一我的因为理解和对命令的处理比另外一我的更快些,也许会比另外一我的对命令的反应更快些。相似的是,两个浏览器均可以理解 JavaScript 代码,可是一个因为其 JavaScript 引擎实现起来效率更高而运行得更快。

浏览器支持的差别

再以即便说一样语言的人们之间也会有差别为例。即便许多人讲英语,可是一些人也许懂得他人不懂的某些词、表达式和与语法规则,反之亦然。浏览器也是一样的道理。尽管浏览器的 JavaScript 引擎都理解 JavaScript ,可是某些浏览器会比其余的浏览器对 JavaScript 理解得更好些。在浏览器对 JavaScript 的支持中就存在着这一的差异。

至于说到浏览器支持,人们一般会谈到 “ECMAScript 兼容性” 而非“ JavaScript 兼容性”,尽管 JavaScript 引擎解析和执行的是 JavaScript 。这个问题提及来有点绕,下面的表格能够对其做出解释。

若是你还记得的话,ECMAScript 是一份规定了脚本语言能够看起来像什么的规范。发布一个新的 ECMAScript 版本并不意味着全部现存的 JavaScript 引擎忽然就拥有了这些新功能。这取决于负责那款 JavaScript 引擎的团体或组织是否要更新到最新的 ECMAScript 规范并采用其所带来的变化。

所以,开发者倾向于问这样的问题,“这款浏览器支持哪一个版本的 ECMAScript ?”或者“这款浏览器支持哪些 ECMAScript 功能?”他们想知道是否 Google、Mozilla 和微软已经开始更新他们浏览器的 JavaScript 引擎了,例如 V八、SpiderMonkey 和 Chakra 是否都已经具备最新的 ECMAScript 中的功能了。

ECMASCript 兼容性列表是回答这类问题的绝佳答案参考。

若是新版的 ECMAScript 发布了,JavaScript 引擎不会一会儿整合全部的更新。他们会逐渐地加入 ECMAScript 功能,这一点从火狐的 JavaScript 变动记录中可见一斑:

JavaScript 运行时

JavaScript 代码运行所在的环境,并为 JavaScript 引擎所解释。运行时提供了 JavaScript 能够运行和操做的宿主对象。

同义词:宿主环境

JavaScript 运行时是在脚本化语言定义中所提到的“已存在的实体或系统”。代码经过 JavaScript 引擎传递,一旦被解析和被理解以后,实体或系统将会执行解释行为。一条狗走路,一我的跑步,一个视频游戏中的任务跳跃(或如上图例子中的那样搞破坏)。

应用程序经过在运行时提供“宿主对象”令其自己可用于 JavaScript 脚本。对于客户方来讲,JavaScript 运行时能够是 web 浏览器,这时如视窗或 HTML 文档这样的宿主对象就能够用于操做了。

你是否曾经使用过视窗或文档宿主对象呢?视窗和文档对象并不是真正的核心 JavaScript 语言的一部分。它们是 Web APIs ,即扮演着 JavaScript 宿主环境的浏览器所提供的对象。对于服务器端来讲,JavaScript 运行时是 Node.js 。服务器相关的宿主对象,如文件系统、处理和请求都在 Node.js 中被提供。

有趣的一点是:不一样的 JavaScript 运行时能够分享一样的 JavaScript 引擎。例如 V8 ,是既为 Google Chrome 也为 Node.js 所用的 JavaScript 引擎—两个大相径庭的环境。

ECMAScript 6

它是 ECMA-262 标准的第六个版本,其特色是对 ECMAScript 规范有着显著的变化和改进。

同义词:ES六、ES2015 和 ECMAScript 2015

这一版的 ECMAScript 将其名字由 ES6 改成了 ES2015 ,这是因为 Ecma 国际决定每一年都对 ECMAScript 发布一次。相应地,Ecma 国际也开始基于每一年所发布的来命名新版本的 ECMAScript 规范。简而言之, ES6 和 ES2015 是对同一件事情的两个不一样的名字。

Babel

一款能够将 ES6 代码转换为 ES5 代码的转译器。

开发者可使用 ES6 中炫目的新功能,但会为他们的 web 应用担忧跨浏览器的兼容性问题。在编写这篇文章的时候,Edge 和 Internet Explorer 并无彻底地支持 ES6 规范中的功能。

有顾虑的开发者可使用 Bable 将 ES6 代码转换为功能同样的版本,只不过使用的是 ES5 功能。全部主流的浏览器都彻底支持 ES5 ,因此他们能够在运行代码时不要担忧任何问题。

一段趣闻

我但愿这些关于 JavaScript 和 ECMAScript 的信息对你有用。在咱们结束以前,我想要再分享一点可以让像我这样的菜鸟 web 开发者茅塞顿开的信息。

先有鸡仍是先有蛋

有一段关于 JavaScript 混淆不清的历史是它是于1996年被开发出来的。而后在1997年被提交给 ECMA 国际用于标准化工做,这致使了 ECMAScript 的诞生。同时,因为 JavaScript 与 ECMAScript 规范保持一致,因此能够说 JavaScript 是根据 ECMAScript 所实现的一个例子。

令咱们感到有趣的是:ECMAScript 是基于 JavaScript 的,而同时 JavaScript 又是基于 ECMAScript 的。

好吧,我知道这听起来就像是一我的穿越变成了本身的父母同样——有点矛盾,不过想起来仍是挺搞笑的。

结束语

我知道阅读本文给你带来了很多欢乐,可是信息量仍是很丰富的。我也要再此说再见了。

若是你有什么问题、评论、建议或考虑的话,请一吐为快。

很是感谢阅读本文!

【编辑推荐】

相关文章
相关标签/搜索