ECMAScript

最新更新: 2019-08-23 09:34:07 阅读: 170次

ECMAScript 和 JavaScript

一个常见的问题是,ECMAScript 和 JavaScript 到底是什么关系?

要讲清楚这个问题,需要回顾历史。1996 年 11 月,JavaScript 的创造者 Netscape 公司,决定将 JavaScript 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。次年,ECMA 发布 262 号标准文件(ECMA-262)的第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。

该标准从一开始就是针对 JavaScript 语言制定的,但是之所以不叫 JavaScript,有两个原因。一是商标,Java 是 Sun 公司的商标,根据授权协议,只有 Netscape 公司可以合法地使用 JavaScript 这个名字,且 JavaScript 本身也已经被 Netscape 公司注册为商标。二是想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。

因此,ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现(另外的 ECMAScript 方言还有 JScript 和 ActionScript)。日常场合,这两个词是可以互换的。

ECMAScript 的历史

ES6 从开始制定到最后发布,整整用了 15 年。

前面提到,ECMAScript 1.0 是 1997 年发布的,接下来的两年,连续发布了 ECMAScript 2.0(1998 年 6 月)和 ECMAScript 3.0(1999 年 12 月)。3.0 版是一个巨大的成功,在业界得到广泛支持,成为通行标准,奠定了 JavaScript 语言的基本语法,以后的版本完全继承。直到今天,初学者一开始学习 JavaScript,其实就是在学 3.0 版的语法。

2000 年,ECMAScript 4.0 开始酝酿。这个版本最后没有通过,但是它的大部分内容被 ES6 继承了。因此,ES6 制定的起点其实是 2000 年。

为什么 ES4 没有通过呢?因为这个版本太激进了,对 ES3 做了彻底升级,导致标准委员会的一些成员不愿意接受。ECMA 的第 39 号技术专家委员会(Technical Committee 39,简称 TC39)负责制订 ECMAScript 标准,成员包括 Microsoft、Mozilla、Google 等大公司。

2007 年 10 月,ECMAScript 4.0 版草案发布,本来预计次年 8 月发布正式版本。但是,各方对于是否通过这个标准,发生了严重分歧。以 Yahoo、Microsoft、Google 为首的大公司,反对 JavaScript 的大幅升级,主张小幅改动;以 JavaScript 创造者 Brendan Eich 为首的 Mozilla 公司,则坚持当前的草案。

2008 年 7 月,由于对于下一个版本应该包括哪些功能,各方分歧太大,争论过于激烈,ECMA 开会决定,中止 ECMAScript 4.0 的开发,将其中涉及现有功能改善的一小部分,发布为 ECMAScript 3.1,而将其他激进的设想扩大范围,放入以后的版本,由于会议的气氛,该版本的项目代号起名为 Harmony(和谐)。会后不久,ECMAScript 3.1 就改名为 ECMAScript 5。

2009 年 12 月,ECMAScript 5.0 版正式发布。Harmony 项目则一分为二,一些较为可行的设想定名为 JavaScript.next 继续开发,后来演变成 ECMAScript 6;一些不是很成熟的设想,则被视为 JavaScript.next.next,在更远的将来再考虑推出。TC39 委员会的总体考虑是,ES5 与 ES3 基本保持兼容,较大的语法修正和新功能加入,将由 JavaScript.next 完成。当时,JavaScript.next 指的是 ES6,第六版发布以后,就指 ES7。TC39 的判断是,ES5 会在 2013 年的年中成为 JavaScript 开发的主流标准,并在此后五年中一直保持这个位置。

2011 年 6 月,ECMAScript 5.1 版发布,并且成为 ISO 国际标准(ISO/IEC 16262:2011)。

2013 年 3 月,ECMAScript 6 草案冻结,不再添加新功能。新的功能设想将被放到 ECMAScript 7。

2013 年 12 月,ECMAScript 6 草案发布。然后是 12 个月的讨论期,听取各方反馈。

2015 年 6 月,ECMAScript 6 正式通过,成为国际标准。从 2000 年算起,这时已经过去了 15 年。

部署进度

各大浏览器的最新版本,对 ES6 的支持可以查看kangax.github.io/compat-table/es6/。随着时间的推移,支持度已经越来越高了,超过 90%的 ES6 语法特性都实现了。

Node 是 JavaScript 的服务器运行环境(runtime)。它对 ES6 的支持度更高。除了那些默认打开的功能,还有一些语法功能已经实现了,但是默认没有打开。使用下面的命令,可以查看 Node 已经实现的 ES6 特性。

//Linux&Mac
$ node--v8-options|grep harmony//Windows
$ node--v8-options|findstr harmony

我写了一个工具 ES-Checker,用来检查各种运行环境对 ES6 的支持情况。访问ruanyf.github.io/es-checker,可以看到您的浏览器支持 ES6 的程度。运行下面的命令,可以查看你正在使用的 Node 环境对 ES6 的支持程度。

$ npm install-g es-checker
$ es-checker=========================================Passes24feature Detections
Your runtime supports57%of ECMAScript6=========================================

语言概述

ECMAScript 是基于对象的:语言的基本部分和宿主设施由对象提供,一个 ECMAScript 程
序是一组可通信的对象。ECMAScript 对象(object)都是未排序的属性 (properties)集合,零个或
多个特征(attributes)来分别确定其中的各属性应如何使用——举个例子:当某个 属性的 
ReadOnly(只读)特征被设为真(true)时, 任何通过执行 ECMAScript 代码来改变这个属性值
的企图都不会生效。属性是装载其它对象的容器,如原语值  (primitive values)或方法
(methods)。原语值是下列内置类型 的一个成员:未定义(Undefined),空值(Null),数 值
(Number),布尔值(Boolean)和字符串(String);对象是保持内置类型对象(Object)的一个成员;
方法是一种通过属性来访问对象的函数。
ECMAScript 定义了一集勾勒出 ECMAScript 定义实体的内置对象(built-in object),它们包
括Global(全局)对象、Object 对象、Function (函数)对象、Array(数组)对象、String
对象、Number对 象、Math(数学库)对象、Date(日期)对象、RegExp(正 则表达式)对
象以及其它 Error 类对象:Error,EvalError(求 值错误),RangeError(越界错误),
ReferenceError(引 用错误),SyntaxError(语法错误),TypeError(类 型错误),
URIError(唯一资源定位符错误)。 
ECMAScript 还定义了一个内置运算符(operators)集合。严格地说,它们可能不是函数或方
法。ECMAScript 运算符包含了各种各样的操作:乘法运算符,加法运算符,位移运算符,关系
运算符,相等关系运算符,二元位操作运算符,二元逻辑运算符,分配运算符,逗号运算符。
ECMAScript 语法被特意设计成类似 Java 的语法。ECMAScript 的语法设计能使其作为一种
易于使用的脚本语言提供服务。例如,一个变量不需要拥有自己的类型声明或与其关联的属性
的类型,定义函数时不需要在它们被调用的上文中出现它们的声明。