ECMAScript 之 Equality Operator
ECMAScript 有別於其他語言,同時提供了 ==
與 ===
兩套 Equality Operator,很多人只使用 ===
,事實上只要了解 ==
的規則,就能善用 ==
。
失くすものさえない今が強くなるチャンスよ
ECMAScript 有別於其他語言,同時提供了 ==
與 ===
兩套 Equality Operator,很多人只使用 ===
,事實上只要了解 ==
的規則,就能善用 ==
。
String 與 Array 都是常用型別,String.prototype
提供了 split()
將 String 轉成 Array。
Array 與 String 都是常用型別,Array.prototype
提供了 join()
將 Array 轉成 String。
ECMAScript 如同 C 語言也有 void
,但存在感很低,甚至很多人從來沒使用過。
ECMAScript 5 原本使用 Array()
對 Array 初始化,而 ECMAScript 2015 迎來了 Array.of()
取代 Array()
。
ECMAScript 有個很特殊的 Array-like Object,本質是 Object,但用起來很像 Array,但卻又不是 Array,因此有些特性不能使用,必須靠一些特殊方式。
ECMAScript 2015 的 Array.from()
是很有趣的 Method,可將 Array-like Object 與 Iterable Object 轉成真正 Array,因此推導出很多有趣應用。
Array.prototype
並沒有 apply()
,所以 Array.apply()
是來自於 Function.prototype.apply()
,且 Array.apply()
有一些特殊性質。
Getter Property 讓我們可兼具 Function 的靈活與 Property 的方便,且其 Lazy 特性在一些需要 CPU 運算場合可延遲執行增進效率。
charAt()
可從 String 回傳指定 Index 的 Char,[]
亦可,不過當找不到時,charAt()
與 []
結果並不相同。
若 Char 存在於 String,String.prototype.indexOf()
會回傳其 index,否則回傳 -1
。
若資料存在於 array,Array.prototype.indexOf()
會回傳其 index,否則回傳 -1
。
ECMAScript 提供了 e
,相當於 10 的 x 次方。
ECMAScript 除了有 Boolean
Primitive 外,還有獨特的 Truthy Value 與 Falsy Value 概念;簡單的說,其他 Type 也能自動轉成 Boolean,這使得 if
與 &&
與 ||
有了更多應用。
String 雖然為 Primitive,但為什麼卻也能如 Object 有 lengh
property 呢 ? 這一切的黑魔法都來自於 Primitive Wrapper。
Tuple 算是 FP 都會提供的資料型別,ECMAScript 雖然沒有提供 Tuple,但可使用 Array Destructuring 輕易實現。
ECMAScript 2015 支援了一般 OOP 常見的 Static Method,但其在 Prototype-based 下究竟是如何實作呢 ?
ECMAScript 是一個以 Object 與 Function 為主的語言,有別於 Class 為主的 OOP,ECMAScript 有獨特的 Property Descriptor,在 Object.create()
、 Object.defineProperty()
與 Object.getOwnPropertyDescriptor()
可使用。
ECMAScript 由 Object 與 Function 構成,傳統 OOP 的 Object 都必須由 Class 而來,但 ECMAScript 的 Object 卻有多種建立方式。
Object.keys()
與 for...in
的差異在於 Object.keys()
只能顯示目前 Object 的 Property,而 for...in
會連同 Prototype 的 Property 一併顯示。若 for...in
搭配 Constructor Function 或 Object.create()
時一切正常,但搭配 class 時,就無法顯示 Prototype 的 Property 了,為什麼會這樣呢 ?
ECMAScript 2015 除了支援一般 OOP 都有的 Class Declaration 外,還繼承了 ECMAScript 傳統,另外提供了 Class Expression,這使得根據條件動態建立 Class 成為可能。
Class 雖然是 Constructor Function 的 Syntatic Sugar,但與真正 Constructor Function 仍有不少差異,本文深入探討兩者差異。
Class 是 OOP 必備觀念,ECMAScript 2015 總算支援 Class,讓很多人倍感親切,但事實上 ECMAScript 的 Class 並非如你想得這麼單純。
ECMAScript 的 Dynamic Type 為其一大特性,讓我們能在 Runtime 對 Object 新增 Property;Function 亦為 Object,因此也能對 Function 新增 Property 取代 Global Variable。
對 Function 傳遞 Argument 是天天都會用到功能,ECMAScript 對 Argument 傳遞語法雖然精簡,但有些雷一不小心就會踩到,因此特別提出來討論。
undefined
是 ECMAScript 很特殊的存在,實務上有多種判斷方式。
ECMAScript 提供了 splice()
刪除 Array 中的 Element,但必須先提供要刪除的 Index
;但若要刪除的是 Object,由於 Object 的比較是 Reference,所以實踐方式比較不一樣。
清空 Array 也是實務上常遇到功能,ECMAScript 並沒有自帶 clear()
Method,必須使用其他方式完成。
ECMAScript 因為提供了 Object Literal,一般我們都會使用 Object Literal 建立 Object,但所建立的 Object 並非 Pure Object,還會繼承 Object.prototype
原本的 Property。
因 Nested Property 不存在而造成 Runtime Exception 是 ECMAScript 常見錯誤,過去會使用 ||
判斷,?.
則提供更精簡寫法,且語意更佳。
若要為 null
與 undefined
提供預設值,由於 null
與 undefined
也是 Falsy Value,過去會使用 ||
,但 Empty String 與 0
亦為 Falsy Value,因此可能會造成意想不到 Bug,且語意也不夠精確,??
提供了更精確的解決方案。
Pipeline Operator 是 ECMAScript 最受期待新功能,它將完全改變 ECMAScript 寫法,唯目前只是 Stage 1,只要在 Babel 另外安裝 Plugin,就可提早享受類似 F# 的 |>
。
雖然前端都使用 ECMAScript 2015 定義的 ES Module,但後端 Node 進度則較慢,還是不少仍使用 CommonJS Module,因此了解 CommonJS 還是必須的。
有些時候二進位表示法非常好用,如要設定 User 權限是否有 新增
、修改
、刪除
、查詢
權限,若每個權限都用二進位的 1 個 bit 表示,0b1111
就表示 4 種權限都有,而 0b1010
則表示只有 新增
與 刪除
權限,以此類推,但這種二進位表示法,該如何在 ECMAScript 使用呢 ?
ES Module 是 ECMAScript 2015 最重要功能,讓 ECMAScript 總算有標準 Module,且語法只有 import
與 export
,非常精簡。
ECMAScript 之前很難寫大程式,主要是因為沒有 Module 概念,常常一個檔案寫兩三千行程式,且大量使用 Global Variable 造成 Side Effect 很難維護。早期會使用 Module Pattern 解決,稍後更有 CommonJS 與 AMD 試圖制定 Module 標準,一直到 ES Module 後,ECMAScript 模組化總算塵埃落定,是重要里程碑。
Map 為 ECMAScript 2015 新支援的資料結構,類似 Object 但功能更強,尤其 Key 可為任何型態包含 Object;若 Key 為 Object 時,由於 ECMAScript 語言特性,將無法簡單使用 get()
取得資料。
if else
與 switch case
是最基本的邏輯判斷方式,但卻也是 複雜度
的元兇,實務上善用 ECMAScript 語言特性與 Higher Order Function 降低複雜度,讓程式碼可讀性更高,也更容易維護。
FP 三部曲 (Declarative、Pure Function 與 Immutable) 中的第二部曲就是 Pure Function,但也由於 ECMAScript 對於 Argument 有 Pass by Value 與 Pass by Reference 兩種,且型別並沒有完整支援 Immutable,因此實現 Pure Function 時有些 Tricky。
ECMAScript 已經內建支援 Regular Expression,其功能強大無庸置疑,但由於可讀性不高,所以一直沒認真學習,但事實上 Regular Expression 投資報酬率非常高,幾乎所有語言都支援,學一次可用一輩子。