[TOC]
# ES5, ES6, ES2016, ES.Next: JavaScript 的版本是怎么回事?

## JavaScript 有著很奇怪的命名史。
1995 年,它作為網(wǎng)景瀏覽器(Netscape Navigator)的一部分首次發(fā)布,網(wǎng)景給這個(gè)新語言命名為 LiveScript。一年后,為了搭上當(dāng)時(shí)媒體熱炒 Java 的順風(fēng)車,臨時(shí)改名為了 JavaScript(*當(dāng)然,Java 和 JavaScript 的關(guān)系,就和雷鋒和雷鋒塔一樣 —— 并沒有什么關(guān)系*)

> 譯者注:[wikipedia 的 JavaScript 詞條](https://en.wikipedia.org/wiki/JavaScript#History)更詳細(xì)的敘述了這段歷史
1996 年,網(wǎng)景將 JavaScript 提交給 ECMA International(歐洲計(jì)算機(jī)制造商協(xié)會(huì))](ECMA International(歐洲計(jì)算機(jī)制造商協(xié)會(huì)))進(jìn)行標(biāo)準(zhǔn)化,并最終確定出新的語言標(biāo)準(zhǔn),它就是 ECMAScript。自此,ECMAScript 成為所有 JavaScript 實(shí)現(xiàn)的基礎(chǔ),不過,由于 JavaScript 名字的歷史原因和市場(chǎng)原因(很顯然 ECMAScript 這個(gè)名字并不令人喜歡……),**現(xiàn)實(shí)中我們只用 ECMAScript 稱呼標(biāo)準(zhǔn),平時(shí)都還是使用 JavaScript 來稱呼這個(gè)語言**。
> 術(shù)語(譯者注):
> * 標(biāo)準(zhǔn)(Standard): 用于定義與其他事物區(qū)別的一套規(guī)則
> * 實(shí)現(xiàn)(Implementation): 某個(gè)標(biāo)準(zhǔn)的具體實(shí)施/真實(shí)實(shí)踐
不過,JavaScript 開發(fā)者們并不怎么在乎這些,因?yàn)樵谡Q生之后的 15 年里,ECMAScript 并沒有多少變化,而且現(xiàn)實(shí)中的很多實(shí)現(xiàn)都已經(jīng)和標(biāo)準(zhǔn)大相徑庭。其實(shí)在第一版的 ECMAScript 發(fā)布后,很快又跟進(jìn)發(fā)布了兩個(gè)版本,但是自從 1999 年 ECMAScript 3 發(fā)布后,十年內(nèi)都沒有任何改動(dòng)被成功添加到官方規(guī)范里。取而代之的,是各大瀏覽器廠商們爭先進(jìn)行自己的語言拓展,web 開發(fā)者們別無選擇只能去嘗試并且支持這些 API。即使是在 2009 年 ECMAScript 5 發(fā)布之后,仍然用了數(shù)年這些新規(guī)范才得到了瀏覽器的廣泛支持,可是大部分開發(fā)者還是寫著 ECMAScript 3 風(fēng)格的代碼,并不覺得有必要去了解這些規(guī)范。
> 譯者注:[ECMAScript 第四版草案](https://en.wikipedia.org/wiki/ECMAScript#4th_Edition_.28abandoned.29)由于太過激進(jìn)而被拋棄,Adobe 的[ActionScript 3.0](https://en.wikipedia.org/wiki/ActionScript)是 ECMAScript edition 4 的唯一實(shí)現(xiàn)( Flash 差點(diǎn)就統(tǒng)一 Web 了)
到了 2012 年,事情突然開始有了轉(zhuǎn)變。大家開始推動(dòng)停止對(duì)舊版本 IE 瀏覽器的支持,用 ECMAScript 5 (ES5) 風(fēng)格來編寫代碼也變得更加可行。與此同時(shí),一個(gè)新的 ECMAScript 規(guī)范也開始啟動(dòng)。**到了這時(shí),大家開始逐漸習(xí)慣以對(duì) ECMAScript 規(guī)范的版本支持程度來形容各種 JavaScript 實(shí)現(xiàn)**。在正式被指名為 ECMAScript 第 6 版 (ES6) 之前,這個(gè)新的標(biāo)準(zhǔn)原本被稱為 ES.Harmony(和諧)。2015 年,負(fù)責(zé)制定 ECMAScript 規(guī)范草案的委員會(huì) TC39 決定將定義新標(biāo)準(zhǔn)的制度改為一年一次,這意味著每個(gè)新特性一旦被批準(zhǔn)就可以添加,而不像以往一樣,規(guī)范只有在整個(gè)草案完成,所有特性都沒問題后才能被定稿。因此,ECMAScript 第 6 版在六月份公布之前,又被重命名為了 ECMAScript 2015(ES2015)
目前,仍然有很多新的 JavaScript 特性或語法正在提議中,包括[decorators(裝飾者)](https://github.com/wycats/javascript-decorators),[async-await(async-await 異步編程模型)](https://github.com/lukehoban/ecmascript-asyncawait)和[static class properties(靜態(tài)類屬性)](https://github.com/jeffmo/es-class-properties)。它們通常被稱為 ES7,ES2016 或者 ES.Next 的特性,不過實(shí)際上它們只能被稱作提案或者說可能性,畢竟 ES2016 的規(guī)范還沒有完成,有可能全部都會(huì)引入,也有可能一個(gè)都沒有。TC39 把一個(gè)提案分為 4 個(gè)階段,你可以在[Babel 的官網(wǎng)](https://babeljs.io/docs/usage/experimental/)上查看各個(gè)提案目前都在哪個(gè)階段了。
## 如何使用這一大堆術(shù)語
所以,我們?cè)撊绾问褂眠@一大堆術(shù)語呢?下面的列表或許能幫助到你:
ECMAScript:一個(gè)由 ECMA International 進(jìn)行標(biāo)準(zhǔn)化,TC39 委員會(huì)進(jìn)行監(jiān)督的語言。通常用于指代標(biāo)準(zhǔn)本身。
JavaScript:ECMAScript 標(biāo)準(zhǔn)的各種實(shí)現(xiàn)的最常用稱呼。這個(gè)術(shù)語并不局限于某個(gè)特定版本的 ECMAScript 規(guī)范,并且可能被用于任何不同程度的任意版本的 ECMAScript 的實(shí)現(xiàn)。
* ECMAScript 5 (ES5):ECMAScript 的第五版修訂,于 2009 年完成標(biāo)準(zhǔn)化。這個(gè)規(guī)范在所有現(xiàn)代瀏覽器中都相當(dāng)完全的實(shí)現(xiàn)了。
* ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015):ECMAScript 的第六版修訂,于 2015 年完成標(biāo)準(zhǔn)化。這個(gè)標(biāo)準(zhǔn)被部分實(shí)現(xiàn)于大部分現(xiàn)代瀏覽器??梢圆殚哰這張兼容性表](http://kangax.github.io/compat-table/es6/)來查看不同瀏覽器和工具的實(shí)現(xiàn)情況。
* ECMAScript 2016:預(yù)計(jì)的第七版 ECMAScript 修訂,計(jì)劃于明年夏季發(fā)布。這份規(guī)范具體將包含哪些特性還沒有最終確定
* ECMAScript Proposals:被考慮加入未來版本 ECMAScript 標(biāo)準(zhǔn)的特性與語法提案,他們需要經(jīng)歷五個(gè)階段:Strawman(稻草人),Proposal(提議),Draft(草案),Candidate(候選)以及 Finished (完成)。
在這整個(gè) Blog 中,我將把目前的 ECMAScript 版本稱作 ES6(因?yàn)檫@是大部分開發(fā)者最習(xí)以為常的),把明年的規(guī)范稱作 ES2016(因?yàn)?,與 ES6/ES2015 不同,這個(gè)名字將在整個(gè)標(biāo)準(zhǔn)化過程中沿用)并且將那些還沒有成為 ECMAScript 定稿或草案的未來語言概念稱為 ECMAScript 提案或者 JavaScript 提案。我將盡我所能在任何可能引起困惑的場(chǎng)合沿用這篇文章。
## JavaScript的版本
1997年7月,ECMAScript 1.0發(fā)布。
1998年6月,ECMAScript 2.0版發(fā)布。
1999年12月,ECMAScript 3.0版發(fā)布,成為JavaScript的通行標(biāo)準(zhǔn),得到了廣泛支持。
2007年10月,ECMAScript 4.0版草案發(fā)布,對(duì)3.0版做了大幅升級(jí),預(yù)計(jì)次年8月發(fā)布正式版本。草案發(fā)布后,由于4.0版的目標(biāo)過于激進(jìn),各方對(duì)于是否通過這個(gè)標(biāo)準(zhǔn),發(fā)生了嚴(yán)重分歧。以Yahoo、Microsoft、Google為首的大公司,反對(duì)JavaScript的大幅升級(jí),主張小幅改動(dòng);以JavaScript創(chuàng)造者Brendan Eich為首的Mozilla公司,則堅(jiān)持當(dāng)前的草案。
2008年7月,由于對(duì)于下一個(gè)版本應(yīng)該包括哪些功能,各方分歧太大,爭論過于激進(jìn),ECMA開會(huì)決定,中止ECMAScript 4.0的開發(fā)(即廢除了這個(gè)版本),將其中涉及現(xiàn)有功能改善的一小部分,發(fā)布為ECMAScript 3.1,而將其他激進(jìn)的設(shè)想擴(kuò)大范圍,放入以后的版本,由于會(huì)議的氣氛,該版本的項(xiàng)目代號(hào)起名為Harmony(和諧)。會(huì)后不久,ECMAScript 3.1就改名為ECMAScript 5。
2009年12月,ECMAScript 5.0版正式發(fā)布。Harmony項(xiàng)目則一分為二,一些較為可行的設(shè)想定名為JavaScript.next繼續(xù)開發(fā),后來演變成ECMAScript 6;一些不是很成熟的設(shè)想,則被視為JavaScript.next.next,在更遠(yuǎn)的將來再考慮推出。TC39的總體考慮是,ECMAScript 5與ECMAScript 3基本保持兼容,較大的語法修正和新功能加入,將由JavaScript.next完成。當(dāng)時(shí),JavaScript.next指的是ECMAScript 6。第六版發(fā)布以后,將指ECMAScript 7。TC39預(yù)計(jì),ECMAScript 5會(huì)在2013年的年中成為JavaScript開發(fā)的主流標(biāo)準(zhǔn),并在此后五年中一直保持這個(gè)位置。
2011年6月,ECMAscript 5.1版發(fā)布,并且成為ISO國際標(biāo)準(zhǔn)(ISO/IEC 16262:2011)。到了2012年底,所有主要瀏覽器都支持ECMAScript 5.1版的全部功能。
2013年3月,ECMAScript 6草案凍結(jié),不再添加新功能。新的功能設(shè)想將被放到ECMAScript 7。
2013年12月,ECMAScript 6草案發(fā)布。然后是12個(gè)月的討論期,聽取各方反饋。
2015年6月,ECMAScript 6正式發(fā)布,并且更名為“ECMAScript 2015”。這是因?yàn)門C39委員會(huì)計(jì)劃,以后每年發(fā)布一個(gè)ECMAScirpt的版本,下一個(gè)版本在2016年發(fā)布,稱為“ECMAScript 2016”。
> 除了ECMAScript的版本,很長一段時(shí)間中,Netscape公司(以及繼承它的Mozilla基金會(huì))在內(nèi)部依然使用自己的版本號(hào)。
這導(dǎo)致了 JavaScript 有自己不同于 ECMAScript 的版本號(hào)。
1996年3月,Navigator 2.0 內(nèi)置了 JavaScript 1.0。
JavaScript 1.1 版對(duì)應(yīng) ECMAScript 1.0,但是直到 JavaScript 1.4 版才完全兼容 ECMAScript 1.0。
JavaScript 1.5 版完全兼容 ECMAScript 3.0。
**目前的 JavaScript 1.8 版完全兼容 ECMAScript 5 。**
## ECMAScript發(fā)生了什么變化?
編程語言 JavaScript 是 ECMAScript 的實(shí)現(xiàn)和擴(kuò)展,由 ECMA(一個(gè)類似W3C的標(biāo)準(zhǔn)組織)參與進(jìn)行標(biāo)準(zhǔn)化。ECMAScript定義了:
[語言語法](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Lexical_grammar) – 語法解析規(guī)則、關(guān)鍵字、語句、聲明、運(yùn)算符等。
類型 – 布爾型、數(shù)字、字符串、對(duì)象等。
原型和繼承
內(nèi)建對(duì)象和函數(shù)的[標(biāo)準(zhǔn)庫](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects) – JSON、Math、數(shù)組方法、對(duì)象自省方法等。
ECMAScript 標(biāo)準(zhǔn)不定義 HTML 或 CSS 的相關(guān)功能,也不定義類似 DOM(文檔對(duì)象模型)的 [Web API](https://developer.mozilla.org/en-US/docs/Web/API) ,這些都在獨(dú)立的標(biāo)準(zhǔn)中進(jìn)行定義。
ECMAScript 涵蓋了各種環(huán)境中 JS 的使用場(chǎng)景,無論是瀏覽器環(huán)境還是類似 [node.js](http://nodejs.org/) 的非瀏覽器環(huán)境。
## 新標(biāo)準(zhǔn)
上周,ECMAScript 語言規(guī)范第6版最終草案提請(qǐng) Ecma 大會(huì)審查,這意味著什么呢?
這意味著在今年夏天,我們將迎來最新的 JavaScript 核心語言標(biāo)準(zhǔn)。
這無疑是一則重磅新聞。早在 2009 年,上一版 ES5 剛剛發(fā)布,自那時(shí)起,ES 標(biāo)準(zhǔn)委員會(huì)一直在緊鑼密鼓地籌備新的JS語言標(biāo)準(zhǔn)—— ES6。
ES6 是一次重大的版本升級(jí),與此同時(shí),由于 ES6 秉承著最大化兼容已有代碼的設(shè)計(jì)理念,你過去編寫的JS代碼將繼續(xù)正常運(yùn)行。事實(shí)上,許多瀏覽器已經(jīng)支持部分 ES6 特性,并將繼續(xù)努力實(shí)現(xiàn)其余特性。這意味著,在一些已經(jīng)實(shí)現(xiàn)部分特性的瀏覽器中,你的 JS 代碼已經(jīng)可以正常運(yùn)行。如果到目前為止你尚未遇到任何兼容性問題,那么你很有可能將不會(huì)遇到這些問題,瀏覽器正飛速實(shí)現(xiàn)各種新特性。
## 版本號(hào)6
**ECMAScript標(biāo)準(zhǔn)的歷史版本分別是1、2、3、5。**
那么為什么沒有第4版?其實(shí),在過去確實(shí)曾計(jì)劃發(fā)布提出巨量新特性的第4版,但最終卻因想法太過激進(jìn)而慘遭廢除(這一版標(biāo)準(zhǔn)中曾經(jīng)有一個(gè)極其復(fù)雜的支持泛型和類型推斷的內(nèi)建靜態(tài)類型系統(tǒng))。
ES4 飽受爭議,當(dāng)標(biāo)準(zhǔn)委員會(huì)最終停止開發(fā) ES4 時(shí),其成員同意發(fā)布一個(gè)相對(duì)謙和的 ES5 版本,隨后繼續(xù)制定一些更具實(shí)質(zhì)性的新特性。這一明確的協(xié)商協(xié)議最終命名為“Harmony”,因此,ES5 規(guī)范中包含這樣兩句話:
>ECMAScript 是一門充滿活力的語言,并在不斷進(jìn)化中。
未來版本的規(guī)范中將持續(xù)進(jìn)行重要的技術(shù)改進(jìn)。
這一聲明許下了一個(gè)未來的承諾。
## 兌現(xiàn)承諾
**2009年發(fā)布的改進(jìn)版本ES5,引入了Object.create()、Object.defineProperty()、getters和setters、嚴(yán)格模式以及JSON對(duì)象。**我已經(jīng)使用過所有這些新特性,并且我非常喜歡ES5做出的改進(jìn)。但事實(shí)上,這些改進(jìn)并沒有深入影響我編寫JS代碼的方式,對(duì)我來說最大的革新大概就是新的[數(shù)組](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)方法:[.map()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)、[. filter()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/filter)這些。
但是,ES6并非如此!經(jīng)過持續(xù)幾年的磨礪,它已成為JS有史以來最實(shí)質(zhì)的升級(jí),新的語言和庫特性就像無主之寶,等待有識(shí)之士的發(fā)掘。新的語言特性涵蓋范圍甚廣,小到受歡迎的語法糖,例如箭頭函數(shù)(arrow functions)和簡單的字符串插值(string interpolation),大到燒腦的新概念,例如代理(proxies)和生成器(generators)。
ES6將徹底改變你編寫JS代碼的方式!
# 附錄:
1. ECMAScript:一個(gè)由 ECMA International 進(jìn)行標(biāo)準(zhǔn)化,TC39 委員會(huì)進(jìn)行監(jiān)督的語言。通常用于指代標(biāo)準(zhǔn)本身。
2. JavaScript:ECMAScript 標(biāo)準(zhǔn)的各種實(shí)現(xiàn)的最常用稱呼。這個(gè)術(shù)語并不局限于某個(gè)特定版本的 ECMAScript 規(guī)范,并且可能被用于任何不同程度的任意版本的 ECMAScript 的實(shí)現(xiàn)。
3. ECMAScript 5 (ES5):ECMAScript 的第五版修訂,于 2009 年完成標(biāo)準(zhǔn)化。這個(gè)規(guī)范在所有現(xiàn)代瀏覽器中都相當(dāng)完全的實(shí)現(xiàn)了。
4. [ECMAScript 6 (ES6) / ECMAScript 2015 (ES2015)](http://www.ecma-international.org/ecma-262/6.0/index.html):ECMAScript 的第六版修訂,于 2015 年完成標(biāo)準(zhǔn)化。這個(gè)標(biāo)準(zhǔn)被部分實(shí)現(xiàn)于大部分現(xiàn)代瀏覽器??梢圆殚嗊@張[兼容性表](https://kangax.github.io/compat-table/es6/)來查看不同瀏覽器和工具的實(shí)現(xiàn)情況。
5. ECMAScript 2016:預(yù)計(jì)的第七版 ECMAScript 修訂,計(jì)劃于明年夏季發(fā)布。這份規(guī)范具體將包含哪些特性還沒有最終確定
6. ECMAScript Proposals:被考慮加入未來版本 ECMAScript 標(biāo)準(zhǔn)的特性與語法提案,他們需要經(jīng)歷五個(gè)階段:Strawman(稻草人),Proposal(提議),Draft(草案),Candidate(候選)以及 Finished (完成)。
## 一些資源
* [TC39 的Github 倉庫](https://github.com/tc39/ecma262)上可以看到所有目前公開的提案
* 如果你還不熟悉 ES6,Babel 有一個(gè)很不錯(cuò)的[特性概覽](https://babeljs.io/docs/learn-es2015/)
* 如果你希望深入 ES6,這里有兩本很不錯(cuò)的書: Axel Rauschmayer 的[Exploring ES6](http://exploringjs.com/)和 Nicholas Zakas 的[Understanding ECMAScript 6](https://leanpub.com/understandinges6)。
* [Axel 的博客2ality](http://www.2ality.com/)也是很不錯(cuò)的 ES6 資源
- 步入JavaScript的世界
- 二進(jìn)制運(yùn)算
- JavaScript 的版本是怎么回事?
- JavaScript和DOM的產(chǎn)生與發(fā)展
- DOM事件處理
- js的并行加載與順序執(zhí)行
- 正則表達(dá)式
- 當(dāng)遇上this時(shí)
- Javascript中apply、call、bind
- JavaScript的編譯過程與運(yùn)行機(jī)制
- 執(zhí)行上下文(Execution Context)
- javascript 作用域
- 分組中的函數(shù)表達(dá)式
- JS之constructor屬性
- Javascript 按位取反運(yùn)算符 (~)
- EvenLoop 事件循環(huán)
- 異步編程
- JavaScript的九個(gè)思維導(dǎo)圖
- JavaScript奇淫技巧
- JavaScript:shim和polyfill
- ===值得關(guān)注的庫===
- ==文章==
- JavaScript框架
- Angular 1.x
- 啟動(dòng)引導(dǎo)過程
- $scope作用域
- $q與promise
- ngRoute 和 ui-router
- 雙向數(shù)據(jù)綁定
- 規(guī)范和性能優(yōu)化
- 自定義指令
- Angular 事件
- lodash
- Test
