JavaScript关系运算符比较时优先转数字(对象先调valueOf再toString),仅两字符串时按Unicode逐位比较;NaN参与的任何关系比较均返回false。

JavaScript 中关系运算符(、=)在比较不同类型值时,不会直接报错,而是按明确规则进行隐式转换后再比较,核心逻辑是“尽量转成数字比,但两个都是字符串时就按 Unicode 比”。结果总是布尔值,但过程容易出人意料。
先转原始值,再判断类型组合
遇到对象(如数组、普通对象)时,会先尝试调用 valueOf(),若返回的不是原始值(如仍是对象),就接着调用 toString()。例如:
-
[]→valueOf()返回自身(非原始值)→toString()返回'' -
[1,2]→toString()返回'1,2' -
{}→toString()返回'[object Object]'
字符串和数字混用:统一转数字再比
只要一边是数字、另一边是可转数字的原始值(如字符串、布尔值、null),JS 就把两边都转成数字后比较:
-
'10' > 5→10 > 5→ true -
true >= 0→1 >= 0→ true null → <code>0 → <strong>true</strong>(<code>Number(null)是0)-
undefined > 0→NaN > 0→ false(任何含NaN的关系比较都返回false)
两个都是字符串:按 Unicode 码点逐位比较
这是唯一不转数字的路径。比较从左到右,一位一位比字符的 Unicode 编码值:
立即学习“Java免费学习笔记(深入)”;
-
'2' > '10'→'2'的码点(50)>'1'的码点(49)→ true(注意:不是数值大小) -
'abc' → 前两位相同,第三位 <code>c(99)d(100)→ true 'a' → 小写字母码点(97)> 大写字母(65)→ <strong>false</strong>
特殊值处理要点
这些行为常被忽略,但直接影响结果:
-
null转数字是0,但null == 0是false(这是==的特殊规则,不影响关系运算符) -
undefined转数字是NaN,所以undefined > 0、undefined == NaN、undefined === undefined都各自独立,别混淆 -
NaN和任何值(包括自身)做关系比较,一律返回false,比如NaN >= NaN是false


















