【JavaScript 筆記】運算子、型別轉換 - part 4
【JavaScript 筆記】運算子、型別轉換 - part 4
歡迎你點入本篇文章,本系列網頁程式設計,主要紀錄我個人自學的軌跡,另外也作為日後個人複習用。若你喜歡本篇文章,歡迎在文章底下點一顆愛心,或是追蹤我的個人公開頁~
運算子(Operator)
JS 有這些類型的運算子:
| 類別 | 英文名稱 | 運算子 |
|---|---|---|
| 算術運算子 | Arithmetic Operators | + - * / % ** ++ -- -(一元) +(一元) |
| 指定運算子 | Assignment Operators | = += -= *= /= %= **= <<= >>= &= |= ^= &&= ||= ??= |
| 比較運算子 | Comparison Operators | == != === !== > >= < <= |
| 邏輯運算子 | Logical Operators | && || ! !! ?? |
| 位元運算子 | Bitwise Operators | & | ^ ~ >> << >>> |
| 三元運算子 | Ternary Operator | ? : |
| 逗號運算子 | Comma Operator | , |
| 一元運算子 | Unary Operators | + - ++ -- delete void |
| 關係運算子 | Relational Operators | in instanceof |
當中 ** 是做冪次運算,即指數運算。
那接下來我會特別寫一些比較特殊的運算子,其餘的部分在其他程式語言都算常見,就不細說了。
比較運算子
你可以發現 JavaScript 多了一個 ===,這個叫做嚴格相等運算子,因為原本的 == 是只有比較值,而在 === 就同時比較值跟資料型別是否正確。
而 !== 也是嚴格比較,除了比較值也比較資料型別。
範例:
1 | // == 寬鬆比較 (會做型別轉換) |
實務建議上,幾乎所有情況都應優先使用 === / !==,避免因隱性型別轉換造成 bug 。
邏輯運算子
!!(雙重否定)
!! 不是獨立運算子,而是兩個 ! 連用,作用是將任意值強制轉換成布林值。
1 | console.log(!!1); // true: 非零數字為 truthy |
??(Nullish Coalescing,空值合併)
?? 只有當左側是 null 或 undefined 時才回傳右側的值,與 || 的差異在於:|| 對所有 falsy 值(如 0、"")都會觸發,但 ?? 不會。
1 | const score = 0; |
位元運算子
>>>(無符號右移)
>> 是有符號右移,保留正負號;>>> 是無符號右移,不管正負,最高位一律補 0,因此對負數結果差異很大。
1 | console.log(8 >> 1); // 4 (1000 -> 0100) |
,(逗號運算子)
逗號運算子會依序執行每個運算式,並回傳最後一個的值,常見於 for 迴圈的初始化或更新區段。
1 | let x = (1, 2, 3); |
一元運算子
delete、void
delete用於刪除物件的屬性。void執行一個運算式但強制回傳undefined,常見於<a href="void(0)">防止頁面跳轉。
1 | // delete: 刪除物件屬性 |
關係運算子
in、instanceof
in檢查某個屬性名稱(key)是否存在於物件中。instanceof檢查某個物件是否是某個建構子(class)的實例。
1 | // in: 檢查屬性是否存在 |
型態轉換(Type Conversion)與強制轉型(Type Coercion)
Type Conversion(型態轉換)是由開發者主動呼叫函式來轉換型別(Explicit)。
而 Type Coercion(強制轉型)則是 JavaScript 引擎在運算時自動隱性轉換,不需要程式開發者來明確要求。
Type Conversion(顯式轉換)
1. String → Number
有三種常用方式,行為略有不同:
1 | // Number(): 嚴格轉換, 無法解析就回傳 NaN |
:::info
註:parseInt 有第二個參數可指定進位:parseInt("ff", 16) -> 255。
:::
2. Number → String
1 | // String() |
3. Boolean → Number
true 等於 1,false 等於 0,這條規則在 Coercion 時很重要 :
1 | Number(true) // 1 |
4. Boolean → String
1 | String(true) // "true" |
Type Coercion(隱式強制轉型)
1. String + Number
+ 運算子具有字串串接的功能,只要其中一方是字串,另一方就會被強制轉成字串:
1 | "5" + 3 // "53": 3 被轉成 "3" 再串接 |
2. Boolean + Number
Boolean 在數學運算中會先被轉成 0 或 1:
1 | true + 1 // 2 (true -> 1) |
3. Comparison of Different Types
== 比較時的型別轉換規則:
1 | // 規則: Number 優先,先把對方轉成 Number 再比 |
4. Boolean Context
當 JavaScript 需要一個布林值時(如 if、while、? :),會自動將值判斷為 truthy 或 falsy :
1 | // Falsy 值 |
總整理
運算子(Operators)
1. 比較運算子:嚴格 vs 寬鬆
===/!==(嚴格):同時比較值與資料型別,避免隱性轉型 bug。==/!=(寬鬆):只比較值,型別不同會先自動轉型再比較。
2. 邏輯運算子
!!(雙重否定):非獨立運算子,用來將任意值強制轉為布林值(例如:!!1變成true)。??(空值合併):僅當左側為null或undefined時,才回傳右側值。與
||的差異:||遇到0或""(空字串)也會觸發右側;??則會保留0和"",適合用於設定預設值。
3. 特殊用途運算子
>>>(無符號右移):不管正負,最高位一律補0。若是負數,結果會變成極大的正整數。,(逗號):依序執行並只回傳最後一個值。常用於for迴圈一次更新多個變數(i++, j--)。delete:專門用來刪除物件屬性(無法刪除用var/let/const宣告的變數)。void:執行運算式但強制回傳undefined(常見應用:<a href="void(0)">防跳轉)。
4. 關係運算子
in:檢查屬性(Key)或陣列索引是否存在於物件/陣列中。instanceof:檢查物件是否為某 Class 或建構子的實例(會追溯繼承鏈)。
型態轉換(Conversion vs Coercion)
- Conversion(顯式轉換):開發者主動寫 Code 轉換。
- Coercion(隱式轉型):JS 引擎在運算時自動轉換。
1. 顯式轉換 (Explicit Conversion)
- 轉 Number:
Number()/+:嚴格,有非數字字元就給NaN(+是最簡短寫法,如+"42")。parseInt()/parseFloat():寬鬆,由左至右解析,遇到非數字才停止。
- 轉 String:
String(值)或.toString(進位制)。- 樣板字串 `` 。
- 轉 Boolean 陷阱:
true轉數字為1,false為0。Boolean("false")結果是true(因為它是一串非空字串)。
2. 隱式轉型 (Implicit Coercion)
- 數學運算的自動轉型:
- 遇到
+:只要有一方是字串,另一方就會變成字串並串接(例:"5" + 1="51")。 - 其他運算(
- * /):沒有字串模式,會強迫將字串轉成數字來算(例:"10" - 3=7)。
- 遇到
==比較的轉型規則:- 偏好轉成 Number 互相比較(例:
"5" == 5、true == 1皆為true)。 - 極端例外:
null只和undefined相等,不等於0或false。
- 偏好轉成 Number 互相比較(例:
- 布林情境(if / while / 三元):
系統會自動判斷值為 Truthy (真值) 或 Falsy (假值)。- Falsy:
false,0,""(空字串),null,undefined,NaN。 - Truthy(易錯陷阱):除了上述 6 個,其他全是 Truthy:
[](空陣列),{}(空物件),"0",-1。
- Falsy:
參考資料
JavaScript Bitwise Operators - GeeksforGeeks
JavaScript Logical Operators - GeeksforGeeks
JavaScript Comparison Operators - GeeksforGeeks
JavaScript Arithmetic Operators - GeeksforGeeks
JavaScript Assignment Operators - GeeksforGeeks
JavaScript Operators - GeeksforGeeks
How is == Different from === in JavaScript? Strict vs Loose Equality Explained
Nullish coalescing operator (??) - JavaScript
Type Conversion and Type Coercion in JavaScript - GeeksforGeeks





