❤ ES6-1【ECMAScript 6简介】

118 阅读6分钟

❤ ES6-1【ECMAScript 6简介】

1、ECMAScript 6简介

ECMAScript 6.0(以下简称 ES6)是 JavaScript 语言的下一代标准, 2015 年 6 月正式发布,使 JavaScript(简称JS)可以用来编写复杂的大型应用程序,从而迈向企业级开发语言。

ECMAScript 和 JS 的关系

1996 年 JS 的创造者 Netscape (也就是网景)公司,决定将 JS 提交给标准化组织 ECMA,希望这种语言能够成为国际标准。

次年,ECMA 就发布了 262 号标准文件第一版,规定了浏览器脚本语言的标准,并将这种语言称为 ECMAScript,这个版本就是 1.0 版。

  • 不叫 JavaScript,有两个原因。

一是商标,Java 是 Sun 公司的商标,JavaScript 本身也已经被 Netscape 公司注册为商标,只有 Netscape 公司可以合法地使用 JavaScript 这个名字 。

二是 想体现这门语言的制定者是 ECMA,不是 Netscape,这样有利于保证这门语言的开放性和中立性。

ECMAScript 和 JS 的关系是

  • ECMAScript 是JS 的规格

  • JS 是ECMAScript的一种实现

ES6 与 ECMAScript 2015 的关系

ECMAScript 2015(简称 ES2015)

ES6 这个词的原意指 JavaScript 语言的下一个版本,但ES6是一个历史名词,也是一个泛指,含义是5.1版以后的JavaScript的下一代标准,而ES2015则是正式名称,特指该年发布的正式版本的语言标准。

因为版本引入的语法功能太多,还有很多组织和个人不断提交新功能。不可能在一个版本里面包括所有将要引入的功能,标准的制定者采用:任何人在任何时候,都可以向标准委员会提交新语法的提案,然后标准委员会每个月开一次会评估这些提案是否可以接受,需要哪些改进。

在每年的 6 月份正式发布一次,作为当年的正式版本

接下来就在这个版本的基础上做改动直到下一年的 6 月份

ES6 的第一个版本在 2015 年 6 月发布了,正式名称就是《ECMAScript 2015 标准》(简称 ES2015)。

2016 年 6 月,小幅修订的《ECMAScript 2016 标准》(简称 ES2016)发布,这个版本可以看作是 ES6.1

语法提案的批准流程

任何人都可以向标准委员会(又称 TC39 委员会)提案,要求修改语言标准。、

而 ECMA 的第 39 号技术专家委员会(Technical Committee 39,简称 TC39)负责制订 ECMAScript 标准,成员包括 Microsoft、Mozilla、Google 等大公司。

一种新的语法从提案到变成正式标准,需要经历五个阶段。每个阶段的变动都由 TC39 委员会批准。

  • Stage 0 - Strawman(展示阶段)
  • Stage 1 - Proposal(征求意见阶段)
  • Stage 2 - Draft(草案阶段)
  • Stage 3 - Candidate(候选人阶段)
  • Stage 4 - Finished(定案阶段)

ECMAScript 的历史

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

ECMAScript 1.0 ,1997 年发布 ECMAScript 2.0,1998 年 6 月 ECMAScript 3.0,1999 年 12 月

3.0 版成功在业界得到广泛支持,成为通行标准,奠定了 JavaScript 语言的基本语法,以后的版本完全继承。初学者一开始学习 JS,其实就是在学 3.0 版的语法。

2000 年,ECMAScript 4.0 酝酿但未通过,ES6 制定的起点其实是 2000 年,因为这个版本太激进了,对 ES3 做了彻底升级,导致标准委员会的一些成员不愿意接受。

个人看法就是应该迭代而不是推倒彻底升级

2007 年 10 月,ECMAScript 4.0 版草案发布

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

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 年。

Node.js 是 JavaScript 的服务器运行环境(runtime)。对 ES6 的支持度高。

查看 Node.js 默认没有打开的 ES6 实验性语法。

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

承担ES6 翻译官的角色

比较通用的工具有:

babel、jsx、traceur、es6-shim 等。

Babel 转码器

Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,


   // 转码前
    input.map(item => item + 1);
    ​
    // 转码后
    input.map(function (item) {
      return item + 1;
    });

上述将箭头函数其转为普通函数,就能在不支持箭头函数的 JavaScript 环境执行了。

  • 安装 Babel。
$ npm install --save-dev @babel/core

配置文件.babelrc

Babel 的配置文件是.babelrc,存放在项目的根目录下。使用 Babel 的第一步,就是配置这个文件。

该文件用来设置转码规则和插件,基本格式如下。

    {
     "presets": [],
     "plugins": []
    }
`presets`字段设定转码规则,官方提供以下的规则集,你可以根据需要安装。

    # 最新转码规则
    $ npm install --save-dev @babel/preset-env
    ​
    # react 转码规则
    $ npm install --save-dev @babel/preset-react

将这些规则加入.babelrc


  {
     "presets": [
          "@babel/env",
          "@babel/preset-react"
      ],
     "plugins": []
}
      
  • 以下所有 Babel 工具和模块的使用,都必须先写好.babelrc

命令行转码

Babel 提供命令行工具@babel/cli,用于命令行转码。

它的安装命令如下。

$ npm install --save-dev @babel/cli

babel-node

@babel/node模块的babel-node命令,提供一个支持 ES6 的 REPL 环境。它支持 Node 的 REPL 环境的所有功能,而且可以直接运行 ES6 代码。

  • 安装。

    $ npm install --save-dev @babel/node

  • 执行babel-node进入 REPL 环境。

    $ npx babel-node

    (x => x * 2)(1) 2

@babel/register 模块

@babel/register模块改写require命令,为它加上一个钩子。此后,每当使用require加载.js.jsx.es.es6后缀名的文件,就会先用 Babel 进行转码。

$ npm install --save-dev @babel/register
  • 使用

首先加载@babel/register

// index.js
require('@babel/register');
require('./es6.js');

然后,就不需要手动对index.js转码了。

$ node index.js
2

需要注意的是,@babel/register只会对require命令加载的文件转码,而不会对当前文件转码。另外,由于它是实时转码,所以只适合在开发环境使用。

polyfill

Babel 默认只转换新的 JavaScript 句法(syntax),而不转换新的 API

ES6 在Array对象上新增了Array.from方法,Babel 就不会转码这个方法。

如果想让这个方法运行,可以使用core-jsregenerator-runtime(后者提供generator函数的转码),为当前环境提供一个垫片。

浏览器环境

Babel 也可以用于浏览器环境,使用@babel/standalone模块提供的浏览器版本,将其插入网页。

注意,网页实时将 ES6 代码转为 ES5,对性能会有影响

Babel 在线转译 Babel提供了一个REPL 在线编译器,可以在线将 ES6 代码转为 ES5 代码,可以直接作为 ES5 代码插入网页运行。