JavaScript 2018: 你需要和不需要深入的
JavaScript 現今已發展成熟 -- 我們也不再是在頁面上做一些小小的互動元素了,而是使用 JavaScript 構建整個大型應用。 當然,這也使得其比過去更為復雜, 在這個變化萬千的 JavaScript 生態系統中,我們也已難以知道整個系統到底有多大。
Ethan Brown,以軟件工程師為職業的同時,還是 兩本 JavaScript 書籍 的作者,均由 O'Reilly 出版。 Ethan Brown 花了大量的時間剖析 JavaScript,嘗試著弄清楚這里面都有什么,以及一個現代 JavaScript 開發者該如何去開始迎合這些東西。
在2018里,對于聰明的開發者們可以去熟悉的東西, Brown 給出了他對 JavaScript 生態系統中各個方面最前沿,至少也是很有用的預測。有兩點需要說明的是: 首先,他基于所有 JavaScript于 標準的這些變化中,指出了一些好的可以去了解的,盡管里面所羅列的一些東西可能不是你所關注的。對這些有一些大體上的了解能夠讓你在遇到困難難以抉擇時,產生聯系,知道去找誰,知道該去了解什么樣的技術。
他還強調到,他所做的這些選擇完全根據他個人的想法以及經驗,這當然可能和你的完全不一樣。Brown 說到: “這些只是我的個人想法,我們都各有各的想法,而且這其中我也會有疏漏。”
先從需要關注的點開始
WebAssembly: WebAssembly 屬于 JavaScript 的一個子集, 它提供了一個針對其他語言的編譯器。 如果你想將你的 C++ 代碼編譯成 JavaScript, WebAssembly 就是你需要了解的 — 它允許幾乎任何語言運行于瀏覽器或者 Node 之中,而且也有了一些比較有意思的應用了。 Brown 說到:“我感覺這個技術會火,會變得非常重要。我也肯定會細心留意,并且在 2018 花些時間去更好的學習它。 ”
函數式編程: “并不是什么新的東西,也已經被 JavaScript 社區的大多數所應用, 但我覺的 2018 才是函數式編程真正達到具有質量和規模的一年”,Brown 說到。對其常見的批評都是更難去學習,更難去理解,Brown 繼續說到,但這也是看待問題的角度不同:讓所有人都開始使用函數式編程,在這種強制性的編程風格下所顯現出的迷惑、副作用以及混亂,我們看來也是非常奇怪的。
Brown 的建議:“如果你想嘗試真正嚴格的函數式編程,你可以看看 Elm 或者 ClojureScript, 不過,你也可以一句話從今天開始 ‘好的,我所有的代碼都要變成純函數式的了’。”
不可變性 (Immutability): 可以和函數式編程搭配在一起。 Brown 說到,“然而大部分人,第一次嘗試不可變數據結構時,都會想:‘Wow, 這不太高效啊,你對所有的東西都創建了副本,所占用的內存不是很必要啊’”。但需要記住的是,Brown 繼續到,你只是復制了變化的那一部分 -- 其他的結構依然保持不變。 同時,在 JavaScript 中進行嚴格比較速度快而且開銷低,大部分切換到不可變數據結構的人都表示性能提升了。
更好的是,不可變性為一些試驗行為提供了天然的保護網 -- 你在知道你無法修改任何已有東西,僅是創建了修改部分的副本的情況下,你會更愿意去試驗那些不熟悉的東西。這對入門開發者來說也非常好。
單向數據綁定: 這是前端同學關心的東西,由 Elm 提出,被 Facebook 應用于 Flux, 進而還有 Redux, 以及現在的 Angular 和 Vue”, Brown 說到。大家都越來越發覺這是個好東西, 在 2018 年也是時候去了解它了。
單向數據綁定讓你更方便地管理應用中的狀態 。 當你第一次嘗試的時候你會想,天啊,又要寫那么多代碼,有點大材小用的樣子了。對于一些小型應用來說,確實是大材小用了,但一旦你的應用達到了一定的規模,將會影響你對整個應用的控制而不僅僅是你所負責的部分。因為當你在使用單向數據綁定時,你需要考慮到應用的每一層數據的流轉。
計算屬性名/字面屬性值簡寫: “可以說這是 ECMAScript 6 (ES6) 的黑馬級特性。但我目前并沒有看到大家經常用到,我覺得會有很多地方可以用到。 他其實是一個小小的語法糖,能夠讓你動態的構建屬性名稱,對象初始化或簡寫對象屬性值。”,Brown 說到。 “我感覺像是每周都用這個特性玩出了新花樣。同時和函數式編程搭配在一起也是挺不錯的, 如果你之前沒見過一定要去了解一下 -- 我更希望看到社區中越來越多人去使用這個特性。”
不需要擔心的東西:
如 Brown 所說,至少現在,某些領域的知識可以選擇跳過。
面向對象編程: “我本人并不太喜歡在 JavaScript 中使用經典的面向對象編程。我認為會有更好的模型,更好的方式去實現代碼復用。所以在 JavaScript 領域中,你也會涉及到面向對象編程的知識但不必為此而感到煩惱。 ”
Generators: “這是 JavaScript 中一個比較酷的特性, 一些地方肯定會有它的使用案例,但我認為其主要的特性已經被 async/await 所替代。 我們很興奮的在 Koa.js 中使用 Generator ,這樣我們就可以用著同步的語義進行異步編程, 但現在有了 async 和 await 而且更好用。 所以除非你覺得在一些奇怪的使用案例中使用生成器比較合理的話也不用在意太多”, Brown 說到。
Symbol: “另外一個好的特性,對 JavaScript 語言的一個補充,但首先:我并沒有看到大家再用他;其次,每次我嘗試去使用 Symbol,除了在框架使用和序列化上出現問題外無其他收獲。”,Brown 說到??偟恼f來,對于 JavaScript 這門語言,他并不認為 Symbol 是個合適的設計。 他的建議:保持觀望的態度。