【JavaScript】字串比大小的型別陷阱

【JavaScript】字串比大小的型別陷阱

本篇重點

  • JavaScript 中「字串」與「數字」如何進行比較?
  • 字串之間的大小比較是依 Unicode 編碼,不是數值
  • 字串與數字混合使用進行比較
  • 避免型別產生的錯誤,提供處理方式
  • 字串與數字在加減乘除的差異

字串比大小結果「不符合預期」

在 JavaScript 中,當你使用 <><=>= 比較兩個字串時,並不會把字串當作數字來比較,而是根據字串的 Unicode 編碼值 進行逐字比較。

範例:

js
1
2
3
console.log("2".charCodeAt(0)); // 50
console.log("10".charCodeAt(0)); // 49
console.log("2" < "10"); // false
  • “2” 的 Unicode 是 50
  • “1” 的 Unicode 是 49
  • 字串逐字比較,因此比較的是 "2" vs "1"50 > 49,所以 "2" < "10" 結果是 false

健忘筆記

使用 .charCodeAt() 可以查詢字串的 Unicode

字串與數字混合使用進行比較

當你用 <, > 比較 一個字串和一個數字 時,JavaScript 會嘗試將字串轉成數字再比較。

範例:

js
1
2
console.log("2" < 10); // true → 字串 "2" 被轉成數字 2
console.log("10" < 2); // false → 字串 "10" 被轉成數字 10

避免型別產生的錯誤

確保 <> 的兩邊是相同型別,使用 parseInt()Number() 將字串轉為數字。

範例:

js
1
2
3
4
5
6
7
8
9
10
11
let str1 = '2';
let str2 = '10';

// 字串轉為數字後再做比較
console.log(typeof parseInt(str1, 10)); // number
console.log(typeof parseInt(str2, 10)); // number
console.log(parseInt(str1, 10) < parseInt(str2, 10)); // true

console.log(typeof Number(str1)); // number
console.log(typeof Number(str2)); // number
console.log(Number(str1) < Number(str2)); // true

補充:字串與數字在加減乘除的差異

不同型別運算時會進行 隱式型態轉換

  • + 運算子在「有字串」的情況下會是 字串串接
  • -*/ 等運算子不做字串串接,而是會嘗試把字串轉成數字再計算。
  • 如果轉換失敗,就會得到 NaN(Not-a-Number)。

字串 + 字串

運算範例結果原因
+"2" + "3""23"+ 觸發字串串接
-"5" - "2"3兩個字串都可轉數字
*"4" * "3"12兩個字串都可轉數字
/"8" / "2"4兩個字串都可轉數字
-"a" - "1"NaN"a" 無法轉為數字

字串 + 數字

運算範例結果原因
+"2" + 3"23"有字串 → 轉成字串串接
-"2" - 11"2" 轉成數字 2
*"3" * 26"3" 轉成數字 3
/"6" / 32"6" 轉成數字 6
js
1
2
3
4
5
6
7
8
9
10
11
// 字串 + 數字
console.log("2" + 3); // "23" → 字串串接
console.log("2" - 1); // 1 → 轉成數字計算
console.log("3" * 2); // 6 → 轉成數字計算
console.log("6" / 3); // 2 → 轉成數字計算

// 字串 + 字串
console.log("5" + "2"); // "52" → 字串串接
console.log("5" - "2"); // 3 → 兩個字串轉成數字計算
console.log("4" * "3"); // 12 → 兩個字串轉成數字計算
console.log("a" - "1"); // NaN → "a" 無法轉為數字

健忘筆記

為了避免運算產生的型別錯誤,請把字串轉為數字再做運算

結論

JavaScript 在進行大小比較時,如果是字串會以 Unicode 字元逐個比較,可能會導致意想不到的結果

  • 養成明確轉型的習慣。
  • 避免字串與數字混合比較。
  • 不確定的地方,可以用 typeof 檢查變數型別。

這樣就能避免很多難以追蹤的錯誤行為,有遇過意想不到的比較結果嗎?歡迎留言分享~

作者

健忘工程師

發表於

2025-08-14

更新於

2025-08-14

許可協議


你可能也想看

【PHP、JavaScript】陣列自定義排序
【Tool】Unix 時間戳(Unix timestamp)轉換
【PHP、JavaScript】三種實用的符號運算子 ?:、??、??=

評論

複製完成