比较运算符(< > <= >=):字符串比较和数值比较怎么转换?
面试速答(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 做四则混算,但关系比较一般是允许的(面试常用口径:比较时会做数值语义对齐)。
- 实战建议:尽量避免混用;需要比较时先统一到同一类型更清晰。