WeHelp
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. 真的一定要字串,那就在比較的時候,轉成數字吧