第一章:ES趟庄?現(xiàn)在與未來

特別說明窿克,為便于查閱,文章轉自https://github.com/getify/You-Dont-Know-JS

在你一頭扎進這本書之前髓涯,你應當可以熟練地使用(在本書寫作時)最近版本的JavaScript袒啼,也就是通常所說的 ES5(技術上講是ES 5.1)。這里,我們打算好好談談即將到來的 ES6蚓再,同時放眼未來去看看JS將會如何繼續(xù)進化滑肉。

如果你還在JavaScript上尋找信心,我強烈推薦你首先讀一讀本系列的其他書目:

  • 入門與進階:你是編程和JS的新手嗎摘仅?這就是你在開啟學習的旅程前需要查看的路線圖靶庙。
  • 作用域與閉包:你知道JS的詞法作用域是基于編譯器(不是解釋器!)語義的嗎娃属?你能解釋閉包是如何成為詞法作用域和函數(shù)作為值的直接結果的嗎六荒?
  • this與對象原型:你能復述this綁定的四個簡單規(guī)則嗎?你有沒有曾經(jīng)在JS中對付著去山寨“類”矾端,而不是采取更簡單的“行為委托”設計模式恬吕?你聽說過 鏈接到其他對象的對象 (OOLO)嗎?
  • 類型與文法:你知道JS中的內(nèi)建類型嗎须床?更重要的是铐料,你知道如何在類型之間正確且安全地使用強制轉換嗎?你對JS文法/語法的微妙之處感到有多習慣豺旬?
  • 異步與性能:你還在使用回調(diào)管理你的異步處理嗎钠惩?你能解釋promise是為什么/如何解決了“回調(diào)地獄”的嗎?你知道如何使用generator來改進異步代碼的易讀性嗎族阅?到底是什么構成了JS程序和獨立操作的成熟優(yōu)化篓跛?

如果你已經(jīng)讀過了這些書目而且對它們涵蓋的內(nèi)容感到十分輕松,那么現(xiàn)在是時候讓我們深入JS的進化過程來探索所有即將到來的以及未來會發(fā)生的改變了坦刀。

與ES5不同愧沟,ES6不僅僅是向語言添加的一組不算太多的新API。它包含大量的新的語法形式鲤遥,其中的一些你可能會花上相當一段時間才能適應沐寺。還有幾種新的組織形式和為各種數(shù)據(jù)類型添加的新API。

對這門語言來說ES6十分激進盖奈。就算你認為你懂得ES5的JS混坞,ES6也滿是 你還不懂的 新東西,所以做好準備钢坦!這本書探索所有你需要迅速掌握的ES6主要主題究孕,并且窺見一下那些你應當注意的正在步入正軌的未來特性。

警告: 這本書中的所有代碼都假定運行在ES6+的環(huán)境中爹凹。在寫作本書時厨诸,瀏覽器和JS環(huán)境(比如Node.js)對ES6的支持相當不同,因此你的感覺可能將會不同禾酱。

版本

JavaScript標準在官方上被稱為“ECMAScript”(縮寫為“ES”)微酬,而且直到最近才剛剛完全采用順序數(shù)字來標記版本(例如绘趋,“5”代表“第五版”)。

最早的版本得封,ES1和ES2,并不廣為人知也沒有大范圍地被實現(xiàn)指郁。ES3是JavaScript第一次廣泛傳播的基準線忙上,并且構成了像IE6-8和更早的Android 2.x移動瀏覽器的JavaScript標準。由于一些超出我們討論范圍的政治原因闲坎,命運多舛的ES4從未問世疫粥。

在2009年,ES5正式定稿(在2011年出現(xiàn)了ES5.1)腰懂,它在瀏覽器的現(xiàn)代革新和爆發(fā)性增長(比如Firefox梗逮,Chrome,Opera绣溜,Safari慷彤,和其他許多)中廣泛傳播,并作為JS標準穩(wěn)定下來怖喻。

預計下一個版本的JS(從2013年到2014年和之后的2015年中的內(nèi)容)底哗,在人們的討論中顯然地經(jīng)常被稱為ES6。

然而锚沸,在ES6規(guī)范的晚些時候跋选,有建議提及未來的版本號也許會切換到編年制,比如用ES2016(也叫ES7)來指代在2016年末之前被定稿的任何版本哗蜈。有些人對此持否定意見前标,但是相對于后來的ES2015來說,ES6將很可能繼續(xù)維持它占統(tǒng)治地位的影響力距潘×读校可是,ES2016事實上可能標志了新的編年制音比。

還可以看到唯鸭,JS進化的頻度即使與一年一度的定版相比都要快得多。只要一個想法開始標準化討論的進程硅确,瀏覽器就開始為這種特性建造原型目溉,而且早期的采用者就開始在代碼中進行實驗。

通常在一個特性被蓋上官方承認的印章以前菱农,由于這些早期的引擎/工具的原型它實際上已經(jīng)被標準化了缭付。所以也可以認為未來的JS版本將是一個特性一個特性的更新,而非一組主要特性的隨意集合的更新(就像現(xiàn)在)循未,也不是一年一年的更新(就像可能將變成的那樣)陷猫。

簡而言之秫舌,版本號不再那么重要了,JavaScript開始變得更像一個常青的绣檬,活的標準足陨。應對它的最佳方法是,舉例來說娇未,不再將你的代碼庫認為是“基于ES6”的墨缘,而是考慮它支持的一個個特性。

轉譯

由于特性的快速進化零抬,給開發(fā)者們造成了一個糟糕的問題镊讼,他們強烈地渴望立即使用新特性,而同時被被現(xiàn)實打臉 —— 他們的網(wǎng)站/app需要支持那些不支持這些特性的老版本瀏覽器平夜。

在整個行業(yè)中ES5的方式似乎已經(jīng)無力回天了蝶棋,它典型的思維模式是,代碼庫等待幾乎所有的前ES5環(huán)境從它們的支持譜系中除名之后才開始采用ES5忽妒。結果呢玩裙,許多人最近(在本書寫作時)才開始采用strict模式這樣的東西,而它早在五年前就在ES5中定稿了段直。

對于JS生態(tài)系統(tǒng)的未來來說献酗,等待和落后于語言規(guī)范那么多年被廣泛地認為是一種有害的方式。所有負責推動語言演進的人都渴望這樣的事情坷牛;只要新的特性和模式以規(guī)范的形式穩(wěn)定下來罕偎,并且瀏覽器有機會實現(xiàn)它們,開發(fā)者就開始基于這些新的特性和模式進行編碼京闰。

那么我們?nèi)绾谓鉀Q這個看起來似乎矛盾的問題颜及?答案是工具,特別是一種稱為 轉譯(transpiling) 的技術(轉換+編譯)蹂楣。大致上俏站,它的想法是使用一種特殊的工具將你的ES6代碼轉換為可以在ES5環(huán)境中工作的等價物(或近似物!)痊土。

例如肄扎,考慮屬性定義縮寫(見第二章的“對象字面擴展”)。這是ES6的形式:

var foo = [1,2,3];

var obj = {
    foo     // 意思是 `foo: foo`
};

obj.foo;    // [1,2,3]

這(大致)是它如何被轉譯:

var foo = [1,2,3];

var obj = {
    foo: foo
};

obj.foo;    // [1,2,3]

這是一個微小但令人高興的轉換赁酝,它讓我們在一個對象字面聲明中將foo: foo縮寫為foo犯祠,如果名稱相同的話。

轉譯器為你實施這些變形酌呆,這個過程通常是構建工作流的一個步驟 —— 與你進行l(wèi)inting衡载,壓縮,和其他類似操作相似隙袁。

填補(Shims/Polyfills)

不是所有的ES6新特性都需要轉譯器痰娱。填補(也叫shims)是一種模式弃榨,在可能的情況下,它為一個新環(huán)境的行為定義一個可以在舊環(huán)境中運行的等價行為梨睁。語法是不能填補的鲸睛,但是API經(jīng)常是可以的。

例如坡贺,Object.is(..)是一個用來檢查兩個值嚴格等價性的新工具官辈,它不帶有===對于NaN-0值的那種微妙的例外。Object.is(..)的填補相當簡單:

if (!Object.is) {
    Object.is = function(v1, v2) {
        // 測試 `-0`
        if (v1 === 0 && v2 === 0) {
            return 1 / v1 === 1 / v2;
        }
        // 測試 `NaN`
        if (v1 !== v1) {
            return v2 !== v2;
        }
        // 其他的一切情況
        return v1 === v2;
    };
}

提示:注意外部的if語句守護性地包圍著填補的內(nèi)容拴念。這是一個重要的細節(jié)钧萍,它意味著這個代碼段僅僅是為這個API還未定義的老環(huán)境而定義的后備行為褐缠;你想要覆蓋既存API的情況是非常少見的政鼠。

有一個被稱為“ES6 Shim”( https://github.com/paulmillr/es6-shim/ )的了不起的ES6填補集合,你絕對應該將它采納為任何新JS項目的標準組成部分队魏!

看起來JS將會繼續(xù)一往無前的進化下去公般,同時瀏覽器也會持續(xù)地小步迭代以支持新特性,而不是大塊大塊地更新胡桨。所以跟上時代的最佳策略就是在你的代碼庫中引入填補官帘,并在你的構建流程中引入一個轉譯器步驟,現(xiàn)在就開始習慣新的現(xiàn)實昧谊。

如果你決定維持現(xiàn)狀刽虹,等待不支持新特性的所有瀏覽器都消失才開始使用新特性,那么你將總是落后于時代呢诬。你將可悲地錯過所有新發(fā)明的設計 —— 而它們使編寫JavaScript更有效涌哲,更高效,而且更健壯尚镰。

復習

ES6(有些人可能會稱它為ES2015)在本書寫作時剛剛定稿阀圾,它包含許多你需要學習的新東西!

但更重要的是狗唉,它將你的思維模式與JavaScript新的進化方式相接軌初烘。不是僅僅為了等待某些官方文檔投票通過而耗上許多年,就像以前許多人做的那樣分俯。

現(xiàn)在肾筐,JavaScript特性一準備好就會在瀏覽器中實現(xiàn),由你來決定是否現(xiàn)在就搭上早班車缸剪,還是去玩兒代價不菲的追車游戲局齿。

不管未來的JavaScript采用什么樣的標簽,它都將會以比以前快得多的速度前進橄登。為了使你位于在這門語言前進方向上的最前列抓歼,轉譯和填補是不可或缺的工具讥此。

如果說對于JavaScript的新現(xiàn)實有什么重要的事情需要理解,那就是所有的JS開發(fā)者都被強烈地懇求從落后的一端移動到領先的一段谣妻。而學習ES6就是這一切的開端萄喳!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹋半,隨后出現(xiàn)的幾起案子垮衷,更是在濱河造成了極大的恐慌,老刑警劉巖拆融,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件淘太,死亡現(xiàn)場離奇詭異,居然都是意外死亡辈灼,警方通過查閱死者的電腦和手機份企,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來巡莹,“玉大人司志,你說我怎么就攤上這事〗嫡” “怎么了骂远?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長腰根。 經(jīng)常有香客問我激才,道長,這世上最難降的妖魔是什么额嘿? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任瘸恼,我火速辦了婚禮,結果婚禮上岩睁,老公的妹妹穿的比我還像新娘钞脂。我一直安慰自己,他們只是感情好捕儒,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布冰啃。 她就那樣靜靜地躺著,像睡著了一般刘莹。 火紅的嫁衣襯著肌膚如雪阎毅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天点弯,我揣著相機與錄音扇调,去河邊找鬼。 笑死抢肛,一個胖子當著我的面吹牛狼钮,可吹牛的內(nèi)容都是我干的碳柱。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼熬芜,長吁一口氣:“原來是場噩夢啊……” “哼莲镣!你這毒婦竟也來了?” 一聲冷哼從身側響起涎拉,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瑞侮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鼓拧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體半火,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年季俩,在試婚紗的時候發(fā)現(xiàn)自己被綠了钮糖。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡种玛,死狀恐怖藐鹤,靈堂內(nèi)的尸體忽然破棺而出瓤檐,到底是詐尸還是另有隱情赂韵,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布挠蛉,位于F島的核電站祭示,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏谴古。R本人自食惡果不足惜质涛,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掰担。 院中可真熱鬧汇陆,春花似錦、人聲如沸带饱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽勺疼。三九已至教寂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間执庐,已是汗流浹背酪耕。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留轨淌,地道東北人迂烁。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓看尼,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盟步。 傳聞我的和親對象是個殘疾皇子狡忙,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

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