Hax 教你如何學習和實踐ES201X?
本文為 100offer 發起的知乎 Live「如何學習和實踐ES201X?」活動整理分享。分享嘉賓為百姓網 前端工程師 賀師俊 (hax)。
上篇主要包含以下幾個方面的內容:
一、為什麼 JavaScript 每年都有新標準?
二、為什麼會造成在10年的時間裡面都沒有新的語言的標準?
三、每年的 ECMAScript 201X 標準又是如何制定和發布的?
四、為什麼要學習和實踐 ES201X?我能不學(用)它們而繼續只寫 ES5(ES3)嗎?
一、為什麼JavaScript為什麼每年都有新標準?
我們知道的前年有 ES2015,去年有 ES2016,今年六月份發布的 ES2017,明年還會有 ES2018,以此類推。但是 JavaScript 以前並不是這樣子的,大家知道 ES2015 其實就是 ES6,之前迭代的版本是 ES1,ES2,ES3,ES5,沒有ES4。
其中第一個版本是 1997 年發布的,ES3 是一個重要的版本,是 1999 年發布的,ES5 大概是 2009 年發布的,兩個重要的版本 ES3 和 ES5 之間隔了十年,這就導致了很多問題。
編程語言和軟體、項目一樣,都是需要進化和發展的,而 JavaScript 在長達 10 年的時間沒有很好的進化。如果一個語言從一開始就設計的非常好,非常完備,可以說它基本不需要變化了,但是 JS 顯然不是這樣子的。從著名的「犀牛書」《JavaScript權威指南》和 Douglas Crockford的《 JavaScript 語言精粹》兩本寶典的厚度對比中就可以看得出來,JS 語言還是有很多問題的。
二、為什麼會造成在 10 年的時間裡面都沒有新的語言的標準?
瀏覽器的發展對於語言是一種拖累
我們經常說的瀏覽器的發展對於語言的發展是一種拖累,因為大家知道如果瀏覽器不升級,在寫代碼的時候要考慮到瀏覽器的兼容性,也就沒有辦法使用最新的特性。這個問題也反映在 ES5 上面,前面講過 ES5 是在 2009 年發布的,但是到 2011 年大多數的 WEB 開發者還是在用 ES3 在寫程序,並沒有用到 ES5 的新特性。據我所知司徒正美(鍾欽成,著名的 JavaScript 專家,去哪兒網前端架構師,曾出版《JavaScript 框架設計》一書)也參加了我的這次 Live。他做了很多的框架,比方說 Avalon,最近又復刻了 React 的一個框架,它們有很多特點,包括支持 IE6 等老舊瀏覽器,大家有興趣的可以去嘗試一下。
現在大部分的框架已經不支持 IE6,IE8 了,基本從 IE9 開始,更有甚者直接從 IE10 和 IE11 開始。但是往前推 5-6 年還不是這個樣子的。所以這個一方面就影響了 JavaScript 語言的進化。
語言委員會中的政治鬥爭問題
在語言委員會中可能有些政治鬥爭的問題,ES4 的死亡有些是因為技術原因,還有些是技術以外的原因,在這塊就不過多涉及了。
因為上述原因,所以每個大版本之間隔得時間會比較長,而且 ES6(ES2015)加了非常多的新特性,例如 Class、iterator、generator、Modules 等這些都是新語言級別的特性,所以需要很長的時間來討論和研發。
在 ES6(ES2015)之後,語言委員會也總結了,認為以後再推進語言的發展,最好不要像 ES6(ES2015)那樣,一次性加入那麼多的特性,這樣做會有很大的困難,需要考慮兼容,JS 是用在 WEB 上的,所以對兼容性的要求就更高。因此委員會決定從 ES6(ES2015)之後,改進之前的推進標準的方法,以前的方法是:
大家一起討論要加入一些什麼特性,全部討論完之後,一次性加入進去;以後不會再這麼做了,而是單個特性一個一個去加,每個特性單獨提案,再根據每個特性自己的發展是不是成熟,瀏覽器的實現是不是跟進了,再來決定這個特性是不是能夠加入到下一年的標準里。
基於這樣的改變,我們現在的標準就變成了 ES2015,2016,2017,以年份來命名的版本號。當然 ES7,ES8,ES9 也可以繼續用這個稱呼,因為數字 6、7、8、9 實際上是標準的版本號,這個標準實際上叫 ECMAScript,也就是 ECMA 標準化組織所制定的標準,每個標準上面都有一個 edition,也就是說這個標準可以不斷的有新的版本,一個完整的 ES6 稱呼應該是 ECMAScript edition 6,你可以用數字編號,但是用年份會更加清楚。
三、每年的 ECMAScript 201X 標準又是如何制定和發布的?
現在每一年的標準是在 ES6(ES2015)的基礎上的更新,比方說 ES2017 就是對 ES2016 的更新,ES2016 就是對 ES2015 的更新,它的更新把當年已經完全成熟並且決定可以進入標準的新的特性提案合併提交到標準文本裡面,到下一年發布出來。
現在是在每年的六、七月份發布正式標準,實際上到底哪些特性可以進入下一年的標準很早就確定了,基本在當年的一月份就已經確定了,如果說一個提案到一月份都沒確定進入標準,就不可能進入到當年的標準,需要放到下一年的標準裡面。
四、為什麼要學習和實踐 ES201X?我能不學(用)它們而繼續只寫 ES5(ES3)嗎?
首先 JavaScript 不會去破壞以前代碼的兼容性,以前代碼跑的結果基本上是不會變的,除非是在非常個別的地方,而且這個地方不僅經過委員會討論,數據也表明整個互聯網都沒有人會寫出這樣的代碼,這樣我們就要改,否則就一定不會改。例如 typeof(null) 返回的是 object,大家也會覺得比較奇怪,針對這點之前也討論過是否要修改,但是最後還是沒有改,保持了原樣。
所以說繼續寫 ES5 和 ES3 也是可以的,代碼是可以跑起來。但是新的版本肯定是有它的好處,畢竟是那些優秀的人聚集在一起,克服各種困難研究出來的,肯定是有些值得學習的地方。我可以舉兩個例子大家看一下:
1.ES6(ES2015)加了 Module,Module 這特性為什麼要加,能不能不加?
當然 Module 可以不加也可以用,有各種各樣的方案,比如 CommonJS 方式可以達到類似的效果。其實這種方式有些問題,因為它不是標準的,有些人會想我也搞一套更好的行不行。雖然現在 CommonJS用的很多,但是在 Browser 中是無法直接用 CommonJS 的,肯定是它的某種變形,比較常見的是 AMD。所以我們需要一個更加統一的格式,像 Module 如果沒有一個統一的標準,就沒有辦法成立了,它是一個重要的代碼復用單元,如果不統一,各用各的,就無法進行下去了。而且 ES6 增加的 Module 是一個靜態的,可以進行靜態分析和更好的性能優化,webpack、rollup 還可以對打包進行簡化,這些都是 CommonJS 不能做的,Module 還有很多的好處,具體大家可以看我的 Blog 上的相關文章,我記得之前有翻譯過一篇相關的文章。
現在有些社區中非常有名的人,對加入 Class 持保留態度,有各種意見很正常,但是我想說的是,Class現在有很多人在用,又沒有標準方式,雖然都大家都是基於原型的,但是還是會有些細微的差別,有時候一點差別比很大的差別更糟糕,因為當有BUG的時候反而更不容易被發現,既然有很多人有這樣的需求,還不如把它標準化。
2. 我們再舉一個還沒有進入標準的例子
可能就是明年的 ES2018 的,是與 Module 相關的,叫 dynamic import,dynamic import 就是你可以在代碼里直接寫入 import,它類似於函數,你傳入 Module 名字,它返回 promise,promise 的值是 Module 對象,你就可以使用 Module 導出的函數。為什麼它會被加入到標準裡面呢?因為它是非常有用的,前面我們講過 ES6 加入 Module 是靜態的,它在程序運行之前已經存在了,所以它沒有辦法實現按需載入這樣的需求,所以這樣的內容需要被加入到標準裡面。
所以對於學不學習新東西,單純的從完成某些需求上來說,可以不用,因為老的方法也可以做出來,但是它可能會存在一些缺陷或者問題,新的東西肯定有它的優勢,比如可能會提供更好的編程體驗,或者與其他東西相關提供更好的性能等等諸如此類的原因,當然可能還有一個更實際的原因,就是新的技術如果不學,可能會被淘汰。
一些公司招人的時候,肯定會問一些新的東西會不會,如果說不會,這肯定是個問題,當然說學這個不僅僅是為了求職,肯定是考慮去完成工作,去實現一些東西,利用這些新特性把它做得更好。這個東西其實是兩面的,為什麼說求職市場為什麼要求你會這個,是因為是互為因果的關係。之後可能會有人會反過來這樣提,我能不能只學新的,只學 ES2016、ES6 及以後的,不學 ES5、ES3 的某些東西,我覺得這肯定是可以的,你已經用了 let,const,你就回去不會搞那些 var 以及 var 那些奇奇怪怪的地方,如果你已經用了新的東西,當然可以不用去管那些比如說 with,因為 with 在 script 模式下 Module 里根本不能用,所以說學了沒太大意義。
反過來說,ES3,ES5 一些老的邊緣性東西可以不用去看,不用去學,但是這是對於初級、中級程序員來講,高級程序員的話,可能還是要被迫去學一下,因為可能你需要維護老的代碼,可能一些老的底層機制你還是要去研究一下,比如說你雖然已經不用去寫class了,但是class底下還是有原型的,所以原型的機制還是要學習一下的,但是一般在用的時候,你完全不用底層原型也是可以的,比如說用 typescript,只要你一直用新的東西,你就不會觸碰到原型,反而在某一些特定的場合,你需要用到的時候再去學習一下,再去深挖歷史。
---
本周的指南欄目就到此位置了,關於如何學習這些新標準、如何在實踐中學習這些新特性,將在下周的指南欄目中接著放送。
如果你實在是等不及,也可以去聽聽這篇分享的知乎 LIVE(點擊原文即可到達傳送門)。


TAG:100offer |