本篇重點
- JavaScript 中「字串」與「數字」如何進行比較?
- 字串之間的大小比較是依 Unicode 編碼,不是數值
- 字串與數字混合使用進行比較
- 避免型別產生的錯誤,提供處理方式
- 字串與數字在加減乘除的差異
字串比大小結果「不符合預期」
在 JavaScript 中,當你使用 <
、 >
、 <=
、 >=
比較兩個字串時,並不會把字串當作數字來比較,而是根據字串的 Unicode 編碼值 進行逐字比較。
範例:
1 | console.log("2".charCodeAt(0)); // 50 |
- “2” 的 Unicode 是
50
- “1” 的 Unicode 是
49
- 字串逐字比較,因此比較的是
"2"
vs"1"
→50 > 49
,所以"2" < "10"
結果是false
字串與數字混合使用進行比較
當你用 <
, >
比較 一個字串和一個數字 時,JavaScript 會嘗試將字串轉成數字再比較。
範例:
1 | console.log("2" < 10); // true → 字串 "2" 被轉成數字 2 |
避免型別產生的錯誤
確保 <
、>
的兩邊是相同型別,使用 parseInt()
、Number()
將字串轉為數字。
範例:
1 | let str1 = '2'; |
補充:字串與數字在加減乘除的差異
不同型別運算時會進行 隱式型態轉換
+
運算子在「有字串」的情況下會是 字串串接。-
、*
、/
等運算子不做字串串接,而是會嘗試把字串轉成數字再計算。- 如果轉換失敗,就會得到
NaN
(Not-a-Number)。
字串 + 字串
運算 | 範例 | 結果 | 原因 |
---|---|---|---|
+ | "2" + "3" | "23" | + 觸發字串串接 |
- | "5" - "2" | 3 | 兩個字串都可轉數字 |
* | "4" * "3" | 12 | 兩個字串都可轉數字 |
/ | "8" / "2" | 4 | 兩個字串都可轉數字 |
- | "a" - "1" | NaN | "a" 無法轉為數字 |
字串 + 數字
運算 | 範例 | 結果 | 原因 |
---|---|---|---|
+ | "2" + 3 | "23" | 有字串 → 轉成字串串接 |
- | "2" - 1 | 1 | "2" 轉成數字 2 |
* | "3" * 2 | 6 | "3" 轉成數字 3 |
/ | "6" / 3 | 2 | "6" 轉成數字 6 |
1 | // 字串 + 數字 |
結論
JavaScript 在進行大小比較時,如果是字串會以 Unicode 字元逐個比較,可能會導致意想不到的結果。
- 養成明確轉型的習慣。
- 避免字串與數字混合比較。
- 不確定的地方,可以用
typeof
檢查變數型別。
這樣就能避免很多難以追蹤的錯誤行為,有遇過意想不到的比較結果嗎?歡迎留言分享~