JavaScript 字串比較大小踩坑記
2025-10-16 22:20:36
前幾天修了一個有趣的 Bug,提出 Issue 的同事描述得非常詳細:
> 最低第一個數字大於最高第一個數字時無法送出
我心想:「咦?所以是 "3" > "10" 也能成立?有這麼酷的事?」
立刻打開程式碼來看:
```TypeScript
checkRange() {
$.each(this.rangeList, (index, item) => {
if (item.maxValue < item.minValue) {
return false;
}
});
}
```
結果真的成立,讓我當下覺得「恩...真是神奇」
於是我問了 GPT,一樣貼上原始碼,Prompt 是:
```
checkRange() { $.each(this.rangeList, (index, item) => { if (item.maxValue < item.minValue) { this.hasError = true; return false; } this.hasError = false; }); }
為啥 3 能大於 10
```
他就直接指出 maxValue 和 minValue 這兩個可能都是字串 !!
我去檢查之後發現,還真的是 XD,最後來總結一下
### 核心問題
當你在 JavaScript 中用 < 或 > 比較兩個值時,
如果它們都是「字串」,比較的方式是依照字典順序(lexicographical order),
不是數值大小。
例如:
| 字元 | Unicode | 說明 |
| --- | ------- | ----- |
| "3" | 51 | 第一個字元 |
| "1" | 49 | 第一個字元 |
第一個字元 "3" (51) 比 "1" (49) 大
所以 "3" > "10" 為 true
後面的 "0" 根本不會被比到
### 結論
1. 要是一開始確定這變數是數字,定義的時候,直接給 number 吧
2. 真的一定要字串,那就在比較的時候,轉成數字吧
點擊複製文章連結