JavaScript关系运算符比较数组时,先调用toString()转为字符串再字典序比较:[]→"",[1,2]→"1,2",[10,2]→"10,2";与数字比较时会进一步转Number,含逗号则得NaN导致结果为false。

JavaScript 中关系运算符(>、<、>=、<=)在比较数组时,**不会直接比较数组内容或长度,而是先将数组隐式转为原始值(字符串),再按字典序比较**。这个过程容易被误解为“数值比较”或“结构比较”,但实际逻辑非常固定。
数组转字符串是默认路径
关系运算符不支持对象类型直接比较,遇到数组(属于 Object)会调用 toString() 方法获取原始值:
-
[]→""(空数组转为空字符串) -
[1]→"1" -
[1, 2]→"1,2" -
[10, 2]→"10,2"
注意:数组的 valueOf() 默认返回自身(仍是对象),所以引擎跳过它,直接走 toString()。
字符串字典序决定大小关系
转换后的字符串按 Unicode 编码逐字符比较,不是数值大小:
立即学习“Java免费学习笔记(深入)”;
-
[10] > [2]→"10" > "2"→false(因为"1"的编码小于"2") -
[2] > [10]→"2" > "10"→true -
[1, 2] < [1, 10]→"1,2" < "1,10"→true(前两位相同,第3位","编码小于"1")
与数字混用时会再转为数字
如果一边是数字,另一边是数组,引擎会尝试把数组转为数字——即先转字符串,再用 Number() 解析:
-
[1] == 1→"1" → 1→true(这是==,但关系运算符同理) -
[1] > 0→"1" → 1 > 0→true -
[1, 2] > 0→"1,2" → NaN→ 比较结果为false(任何值与NaN的关系比较都返回false) -
[] > -1→"" → 0 > -1→true
空数组和特殊数组的典型行为
这些例子体现规则的一致性:
-
[] == false→"" → 0,0 == 0→true -
[0] < [1]→"0" < "1"→true -
[null] > [0]→"null" > "0"→true("n"编码远大于"0") -
[undefined] == 0→"undefined" → NaN→false


















