跳到主要内容

比较运算符(< > <= >=):字符串比较和数值比较怎么转换?

面试速答(30 秒版 TL;DR)

  • 关系比较(< > 等)走“抽象关系比较”:
    • 先 ToPrimitive(对象先变原始值)
    • 如果两边都是字符串:按**字典序(码点/码元序)**比较
    • 否则:两边转成数值(Number/BigInt 语义)再比较
  • 记住:只要出现 NaN<><=>= 的结果通常都是 false(因为比较结果是“未知”)。

字符串比较:不是按长度,是按字典序

"2" > "10"; // true(先比 '2' 和 '1')
"a" > "B"; // true(大小写会影响码点顺序)

面试口径:

  • 两边都是字符串时,不会转数字,直接按字典序比较。

一旦不是“纯字符串对纯字符串”,就会走数值语义

"2" > 10; // false("2" -> 2)
"2" > "10"; // true(字符串对字符串,不转数字)

对象参与比较:先 ToPrimitive

[] < 1; // true([] -> "" -> 0)
({}) < 1; // false({} -> "[object Object]" -> NaN,比较为 false)

<= / >= 的坑:它们不是简单的 “取反”

很多人会想当然地把 a <= b 当成 !(a > b),但在 NaN 参与时就会翻车:

NaN <= 1; // false
NaN > 1; // false

面试口径:

  • 由于 NaN 的比较结果是“未知”,两个方向都可能是 false

BigInt 与 Number 的比较

  • BigInt 不能和 Number 做四则混算,但关系比较一般是允许的(面试常用口径:比较时会做数值语义对齐)。
  • 实战建议:尽量避免混用;需要比较时先统一到同一类型更清晰。