ECMAScript6 簡介

轉(zhuǎn)自ECMAScript 6 簡介 阮一峰
ECMAScript 6.0(以下簡稱 ES6)是 JavaScript 語言的下一代標準凝危,已經(jīng)在 2015 年 6 月正式發(fā)布了您单。它的目標踢代,是使得 JavaScript 語言可以用來編寫復雜的大型應用程序砾脑,成為企業(yè)級開發(fā)語言兔乞。


1. ECMAScript 和 JavaScript 的關系

一個常見的問題是岳守,ECMAScript 和 JavaScript 到底是什么關系凄敢?

要講清楚這個問題,需要回顧歷史湿痢。1996 年 11 月涝缝,JavaScript 的創(chuàng)造者 Netscape 公司,決定將 JavaScript 提交給國際標準化組織 ECMA譬重,希望這種語言能夠成為國際標準拒逮。次年,ECMA 發(fā)布 262 號標準文件(ECMA-262)的第一版臀规,規(guī)定了瀏覽器腳本語言的標準滩援,并將這種語言稱為 ECMAScript,這個版本就是 1.0 版塔嬉。

該標準從一開始就是針對 JavaScript 語言制定的玩徊,但是之所以不叫 JavaScript,有兩個原因谨究。一是商標恩袱,Java 是 Sun 公司的商標,根據(jù)授權協(xié)議胶哲,只有 Netscape 公司可以合法地使用 JavaScript 這個名字畔塔,且 JavaScript 本身也已經(jīng)被 Netscape 公司注冊為商標。二是想體現(xiàn)這門語言的制定者是 ECMA,不是 Netscape澈吨,這樣有利于保證這門語言的開放性和中立性把敢。

因此,ECMAScript 和 JavaScript 的關系是棚辽,前者是后者的規(guī)格技竟,后者是前者的一種實現(xiàn)(另外的 ECMAScript 方言還有 Jscript 和 ActionScript)。日常場合屈藐,這兩個詞是可以互換的榔组。


2. ES6 與 ECMAScript 2015 的關系

ECMAScript 2015(簡稱 ES2015)這個詞,也是經(jīng)沉撸可以看到的搓扯。它與 ES6 是什么關系呢?

2011 年包归,ECMAScript 5.1 版發(fā)布后锨推,就開始制定 6.0 版了。因此公壤,ES6 這個詞的原意换可,就是指 JavaScript 語言的下一個版本。

但是厦幅,因為這個版本引入的語法功能太多沾鳄,而且制定過程當中,還有很多組織和個人不斷提交新功能确憨。事情很快就變得清楚了译荞,不可能在一個版本里面包括所有將要引入的功能。常規(guī)的做法是先發(fā)布 6.0 版休弃,過一段時間再發(fā) 6.1 版吞歼,然后是 6.2 版、6.3 版等等塔猾。

但是篙骡,標準的制定者不想這樣做。他們想讓標準的升級成為常規(guī)流程:任何人在任何時候丈甸,都可以向標準委員會提交新語法的提案医增,然后標準委員會每個月開一次會,評估這些提案是否可以接受老虫,需要哪些改進叶骨。如果經(jīng)過多次會議以后,一個提案足夠成熟了祈匙,就可以正式進入標準了忽刽。這就是說天揖,標準的版本升級成為了一個不斷滾動的流程,每個月都會有變動跪帝。

標準委員會最終決定今膊,標準在每年的 6 月份正式發(fā)布一次,作為當年的正式版本伞剑。接下來的時間斑唬,就在這個版本的基礎上做改動,直到下一年的 6 月份黎泣,草案就自然變成了新一年的版本恕刘。這樣一來,就不需要以前的版本號了抒倚,只要用年份標記就可以了褐着。

ES6 的第一個版本,就這樣在 2015 年 6 月發(fā)布了托呕,正式名稱就是《ECMAScript 2015 標準》(簡稱 ES2015)含蓉。2016 年 6 月,小幅修訂的《ECMAScript 2016 標準》(簡稱 ES2016)如期發(fā)布项郊,這個版本可以看作是 ES6.1 版馅扣,因為兩者的差異非常小(只新增了數(shù)組實例的includes方法和指數(shù)運算符)着降,基本上是同一個標準差油。根據(jù)計劃,2017 年 6 月發(fā)布 ES2017 標準鹊碍。

因此,ES6 既是一個歷史名詞食绿,也是一個泛指侈咕,含義是 5.1 版以后的 JavaScript 的下一代標準,涵蓋了 ES2015器紧、ES2016耀销、ES2017 等等,而 ES2015 則是正式名稱铲汪,特指該年發(fā)布的正式版本的語言標準熊尉。本書中提到 ES6 的地方,一般是指 ES2015 標準掌腰,但有時也是泛指“下一代 JavaScript 語言”狰住。


3. 語法提案的批準流程

任何人都可以向標準委員會(又稱 TC39 委員會)提案,要求修改語言標準齿梁。

一種新的語法從提案到變成正式標準催植,需要經(jīng)歷五個階段肮蛹。每個階段的變動都需要由 TC39 委員會批準。

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

一個提案只要能進入 Stage 2创南,就差不多肯定會包括在以后的正式標準里面伦忠。ECMAScript 當前的所有提案,可以在 TC39 的官方網(wǎng)站Github.com/tc39/ecma262查看稿辙。

本書的寫作目標之一昆码,是跟蹤 ECMAScript 語言的最新進展,介紹 5.1 版本以后所有的新語法邻储。對于那些明確或很有希望赋咽,將要列入標準的新語法,都將予以介紹芥备。


4. ECMAScript 的歷史

ES6 從開始制定到最后發(fā)布冬耿,整整用了 15 年。

前面提到萌壳,ECMAScript 1.0 是 1997 年發(fā)布的亦镶,接下來的兩年,連續(xù)發(fā)布了 ECMAScript 2.0(1998 年 6 月)和 ECMAScript 3.0(1999 年 12 月)袱瓮。3.0 版是一個巨大的成功缤骨,在業(yè)界得到廣泛支持,成為通行標準尺借,奠定了 JavaScript 語言的基本語法绊起,以后的版本完全繼承。直到今天燎斩,初學者一開始學習 JavaScript虱歪,其實就是在學 3.0 版的語法。

2000 年栅表,ECMAScript 4.0 開始醞釀笋鄙。這個版本最后沒有通過,但是它的大部分內(nèi)容被 ES6 繼承了怪瓶。因此萧落,ES6 制定的起點其實是 2000 年。

為什么 ES4 沒有通過呢洗贰?因為這個版本太激進了找岖,對 ES3 做了徹底升級,導致標準委員會的一些成員不愿意接受敛滋。ECMA 的第 39 號技術專家委員會(Technical Committee 39许布,簡稱 TC39)負責制訂 ECMAScript 標準,成員包括 Microsoft绎晃、Mozilla爹脾、Google 等大公司帖旨。

2007 年 10 月,ECMAScript 4.0 版草案發(fā)布灵妨,本來預計次年 8 月發(fā)布正式版本解阅。但是,各方對于是否通過這個標準泌霍,發(fā)生了嚴重分歧货抄。以 Yahoo、Microsoft朱转、Google 為首的大公司蟹地,反對 JavaScript 的大幅升級,主張小幅改動藤为;以 JavaScript 創(chuàng)造者 Brendan Eich 為首的 Mozilla 公司怪与,則堅持當前的草案。

2008 年 7 月缅疟,由于對于下一個版本應該包括哪些功能分别,各方分歧太大,爭論過于激烈存淫,ECMA 開會決定耘斩,中止 ECMAScript 4.0 的開發(fā),將其中涉及現(xiàn)有功能改善的一小部分桅咆,發(fā)布為 ECMAScript 3.1括授,而將其他激進的設想擴大范圍,放入以后的版本岩饼,由于會議的氣氛荚虚,該版本的項目代號起名為 Harmony(和諧)。會后不久籍茧,ECMAScript 3.1 就改名為 ECMAScript 5版述。

2009 年 12 月,ECMAScript 5.0 版正式發(fā)布硕糊。Harmony 項目則一分為二院水,一些較為可行的設想定名為 JavaScript.next 繼續(xù)開發(fā)腊徙,后來演變成 ECMAScript 6简十;一些不是很成熟的設想,則被視為 JavaScript.next.next撬腾,在更遠的將來再考慮推出螟蝙。TC39 委員會的總體考慮是,ES5 與 ES3 基本保持兼容民傻,較大的語法修正和新功能加入胰默,將由 JavaScript.next 完成场斑。當時,JavaScript.next 指的是 ES6牵署,第六版發(fā)布以后漏隐,就指 ES7。TC39 的判斷是奴迅,ES5 會在 2013 年的年中成為 JavaScript 開發(fā)的主流標準青责,并在此后五年中一直保持這個位置。

2011 年 6 月取具,ECMAscript 5.1 版發(fā)布脖隶,并且成為 ISO 國際標準(ISO/IEC 16262:2011)。

2013 年 3 月暇检,ECMAScript 6 草案凍結(jié)产阱,不再添加新功能。新的功能設想將被放到 ECMAScript 7块仆。

2013 年 12 月构蹬,ECMAScript 6 草案發(fā)布。然后是 12 個月的討論期榨乎,聽取各方反饋怎燥。

2015 年 6 月,ECMAScript 6 正式通過蜜暑,成為國際標準铐姚。從 2000 年算起,這時已經(jīng)過去了 15 年肛捍。


5. 部署進度

各大瀏覽器的最新版本隐绵,對 ES6 的支持可以查看kangax.github.io/es5-compat-table/es6/。隨著時間的推移拙毫,支持度已經(jīng)越來越高了依许,超過 90%的 ES6 語法特性都實現(xiàn)了。

Node 是 JavaScript 的服務器運行環(huán)境(runtime)缀蹄。它對 ES6 的支持度更高峭跳。除了那些默認打開的功能,還有一些語法功能已經(jīng)實現(xiàn)了缺前,但是默認沒有打開蛀醉。使用下面的命令,可以查看 Node 已經(jīng)實現(xiàn)的 ES6 特性衅码。

$ node --v8-options | grep harmony

上面命令的輸出結(jié)果拯刁,會因為版本的不同而有所不同。

我寫了一個工具

ES-Checker逝段,用來檢查各種運行環(huán)境對 ES6 的支持情況垛玻。訪問ruanyf.github.io/es-checker割捅,可以看到您的瀏覽器支持 ES6 的程度。運行下面的命令帚桩,可以查看你正在使用的 Node 環(huán)境對 ES6 的支持程度亿驾。

$ npm install -g es-checker
$ es-checker

=========================================
Passes 24 feature Dectations
Your runtime supports 57% of ECMAScript 6
=========================================

6. Babel 轉(zhuǎn)碼器

Babel

是一個廣泛使用的 ES6 轉(zhuǎn)碼器,可以將 ES6 代碼轉(zhuǎn)為 ES5 代碼账嚎,從而在現(xiàn)有環(huán)境執(zhí)行颊乘。這意味著,你可以用 ES6 的方式編寫程序醉锄,又不用擔心現(xiàn)有環(huán)境是否支持乏悄。下面是一個例子。

// 轉(zhuǎn)碼前
input.map(item => item + 1);

// 轉(zhuǎn)碼后
input.map(function (item) {
  return item + 1;
});

上面的原始代碼用了箭頭函數(shù)恳不,Babel 將其轉(zhuǎn)為普通函數(shù)檩小,就能在不支持箭頭函數(shù)的 JavaScript 環(huán)境執(zhí)行了。


配置文件.babelrc

Babel 的配置文件是.babelrc烟勋,存放在項目的根目錄下规求。使用 Babel 的第一步,就是配置這個文件卵惦。

該文件用來設置轉(zhuǎn)碼規(guī)則和插件阻肿,基本格式如下。

{
  "presets": [],
  "plugins": []
}

presets字段設定轉(zhuǎn)碼規(guī)則沮尿,官方提供以下的規(guī)則集丛塌,你可以根據(jù)需要安裝。

# 最新轉(zhuǎn)碼規(guī)則
$ npm install --save-dev babel-preset-latest

# react 轉(zhuǎn)碼規(guī)則
$ npm install --save-dev babel-preset-react

# 不同階段語法提案的轉(zhuǎn)碼規(guī)則(共有4個階段)畜疾,選裝一個
$ npm install --save-dev babel-preset-stage-0
$ npm install --save-dev babel-preset-stage-1
$ npm install --save-dev babel-preset-stage-2
$ npm install --save-dev babel-preset-stage-3

然后赴邻,將這些規(guī)則加入.babelrc。

  {
    "presets": [
      "latest",
      "react",
      "stage-2"
    ],
    "plugins": []
  }

注意啡捶,以下所有 Babel 工具和模塊的使用姥敛,都必須先寫好.babelrc。


?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末瞎暑,一起剝皮案震驚了整個濱河市彤敛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件怎抛,死亡現(xiàn)場離奇詭異,居然都是意外死亡渠概,警方通過查閱死者的電腦和手機茶凳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門嫂拴,熙熙樓的掌柜王于貴愁眉苦臉地迎上來播揪,“玉大人,你說我怎么就攤上這事筒狠≈肀罚” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵辩恼,是天一觀的道長雇庙。 經(jīng)常有香客問我,道長灶伊,這世上最難降的妖魔是什么疆前? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮聘萨,結(jié)果婚禮上竹椒,老公的妹妹穿的比我還像新娘。我一直安慰自己米辐,他們只是感情好胸完,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翘贮,像睡著了一般赊窥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上狸页,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天锨能,我揣著相機與錄音,去河邊找鬼芍耘。 笑死腹侣,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的齿穗。 我是一名探鬼主播傲隶,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼窃页!你這毒婦竟也來了跺株?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤脖卖,失蹤者是張志新(化名)和其女友劉穎乒省,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體畦木,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡袖扛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蛆封。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡唇礁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出惨篱,到底是詐尸還是另有隱情盏筐,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布砸讳,位于F島的核電站琢融,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏簿寂。R本人自食惡果不足惜漾抬,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望常遂。 院中可真熱鬧奋蔚,春花似錦、人聲如沸烈钞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毯欣。三九已至馒过,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間酗钞,已是汗流浹背腹忽。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砚作,地道東北人窘奏。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像葫录,于是被迫代替她去往敵國和親着裹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容