Promise Chain 之 Multiple Catch
雖然實務上 Promise Chain 大都只有一個 catch
,但事實上也能同時有多個 catch
,可繼續新的 Asynchornous Function,或者將 Error Handling 在不同 catch
分段處理。
失くすものさえない今が強くなるチャンスよ
雖然實務上 Promise Chain 大都只有一個 catch
,但事實上也能同時有多個 catch
,可繼續新的 Asynchornous Function,或者將 Error Handling 在不同 catch
分段處理。
Array.prototype.forEach
只能接受傳入 Synchronous Function,若要傳入 Asynchronous Function,可依需求使用不同方式實現。
ECMAScript 2015 最大特色是將 Promise 定為語言標準,以 Promise 取代 Callback,當在 forEach
內使用 ECMAScript 2017 的 Asynchronous Function 時,會有意想不到結果。
Array.prototype.filter
只能接受傳入 Synchronous Function,若要傳入 Asynchronous Function,可依需求使用不同方式實現。
Array.prototype.map
只能接受傳入 Synchronous Function,若要傳入 Asynchronous Function,可依需求使用不同方式實現。
ECMAScript 支援 First Class Function,所以可將各 Function 相同部分抽成 Higher Order Function,不同部分亦抽成小 Function,最後以 Argument 傳入產生各 Function。
Function 是 ECMAScript 的主體,一共提供了 4 種方式定義 function。
若要將 Object 的所有 Value 轉成 Array,可使用 Object.values()
。
當 Function 回傳 Function 時,Function 外的 Variable 將保存隨其 Function 改變,此為使用 Closure 的 Module Pattern,事實上 Vue 3 的 Module 就是 Module Pattern 應用。
ECMAScript Object 的 Property 基本上是由 Key / Value 構成,連 Method 也是廣義 Property,我們該如何取得 Object 的所有 Key 呢 ?
若要將 Object 的所有 Key 轉成 Array,可使用 Object.keys()
。
ECMAScript 之基本型別有 String、Number、Boolean、Object、Array 與 Function,可由其 Prototype Chain 更了解這些型別特性。
除了一般語言都有的 Global Scope 與 Local Scope 外, ECMAScript 還有一個很特殊的 Lexical Scope,這導致了 Closure 與日後 Functional Programming 發展。
不只 OOP 有 Design Pattern,事實上 FP 也有不少 Pattern,而 Currying 算 FP 最基礎、使用最多的 Pattern。ECMAScript 雖然沒有直接支援,但因為有 First-class Function 、Lexical Scope,使得 Currying 在 ECMAScript 中使用成為可能。
ECMAScript 2015 支援 Class 之後,很多人認為總算達到 OOP 該有高度,事實上 ECMAScript 仍有其他方式亦可完成所有 Class 能做事情。
若要在 String 之後根據指定長度補 0
,ECMAScript 提供了 padEnd()
。
若要在 String 之前根據指定長度補 0
,ECMAScript 提供了 padStart()
。
ECMAScript 2015 支援了 extends
,至此 ECMAScript 能輕鬆實踐 Inheritance,但事實上也能由 Prototype Chain 實現。
ECMAScript 2015 雖然支援了 class
語法,但本質上仍是使用 Prototype 實作,本文深入探討其背後黑魔法。
ECMAScript 5 並沒有 Class,雖然仍然可以使用 new
建立 Object,但必須透過 Constructor Function,但究竟 Constructor Function 有什麼黑魔法,竟然可以使用 new
建立 Object 呢 ?
Object 有 3 個非常像的 Property:__proto__
、prototype
與 [[prototype]]
,徹底了解有助於我們看清 Prototype 本質。
Object.create()
從 ECMAScript 5.1 就開始提供,與 new
不同的是 Object.create()
讓我們可直接根據 Prototype 建立 Object,事實上我們也可土炮實作。
實務上我們常需判斷 Array 是否 任意
資料符合某條件,若存在則傳回 true
,若不存在則傳回 false
,ECMAScript 提供了 some()
可判斷。
實務上我們常需判斷 Array 是否 全部
符合某條件,若存在則傳回 true,若不存在則傳回 false,ECMAScript 提供了 every()
可判斷。
因為 ECMAScript 支援 First-class Function,因此可在 Function 內定義其他 Function,當 Function 內找不到 Variable 時,會先在 Function 內尋找,若找不到則往 Function 外層尋找,最後才會到 Global 尋找,此稱為 Scope Chain。
&&
與 ||
為 ECMAScript 很具代表性的 Operator,事實上 ,
與 &&
與 ||
非常類似,尤其在 Promise Chain 中非常實用。
ECMAScript 2020 支援了 ?.
Optional Chaining Operator,至此 ECMAScript 終於有專屬的 Operator 用於 Nested Object,不必再借用 &&
與 Falsy Value。
ECMAScript 2020 支援了 ??
Nullish Coalescing Operator,至此 ECMAScript 終於有專屬的 Operator 判斷 null
與 undefined
,不必再借用 ||
與 Falsy Value。
replace()
可取代 String,搭配 Regular Expression /g
可一次取代所有 String。
ECMAScript 雖然也有 Class、Object 與 Method 與 this
概念,但其 Method 本質仍是 Free Function,只是 this
指向 Object,也因為如此,所以能夠使用 Objet Destructure 從 Method 抽成 Free Function。
ECMAScript 2015 新增了 Object.fromEntries()
可將 Pair Array 轉成 Object。
ECMAScript Function 的 arguments
是 Array-like Object,僅有部分 Array 功能,實務上我們會希望把 arguments
當成真正 Array 操作。
ECMAScript 除了 Promise Chain 外,還有所謂的 Scope Chain,當 Inner Function 存取 Variable 時,會依序以 Local Scope、Lexical Scope,最後才是 Global Scope 尋找,此稱為 Scope Chain。
ECMAScript 2015 是 ECMAScript 歷史上最重要一次升級,也讓 ECMAScript 終於趕上主流程式語言高度,若要明顯的分辨 ES5 與 ES6,最明顯的方式的方式就是看有沒有使用 let
。
this
在 OOP 相對單純,都是代表固定 Object,但在 ECMAScript 則是嚴肅課題,主要是 ECMAScript 是以 Function 為核心,OOP 是由 Function 實現,因此 this
觀念大異其趣。
ECMAScript 是一個包含多種 Paradigm 的程式語言,當使用 this
時,基本上就是以 OOP 風格開發,以 this
指向 Object。目前 ECMAScript 有 Object Literal、Constructor Function 與 Class 三種方式實現 OOP,將分別討論之。
var
支援 Hoisting, 因此可在執行之後才使用 var
宣告 variable 與 function;但 let
不支援 Hoisting,只能在執行前先宣告好,因為 var
在 JavaScript Engine 的 Creation Phase 已經將 Variable 與 Function 建立完成。
var
從 ECMAScript 一開始就存在,也是代表 Keyword,看到 var
就可以判斷是 ECMAScript 了。但 var
在 ECMAScript 2015 之後有了一些改變,重要性也不若以往,TC39 甚至建議完全不要使用 var
,改用 let
與 const
。
Higher Order Function 、Closure 與 IIFE 三者常同時使用,可讓 Codebase 更為精簡。
有時候我們希望 Function 執行完後,Variable 仍然有效,此稱為 Static Variable,ECMAScript 並沒有直接支援 Static Variable,但可使用 Function Property 或 Closure 實現。