我正在尝试比较 javascript 中的两个数组。
我想要的是:
a < b ⇔ ∃ i ≥ 0 s.t. a[i] < b[i] and ∀ 0 ≤ j < i, a[j] = b[j]
因此非负数数组可以按预期工作:
firebug> [0,1,2,3,4] < [1,0,0]
true
并且将负数与零进行比较按预期工作:
firebug> [-1, 1] < [0, 0]
true
但是比较负数和负数是......令人惊讶的:
firebug> [-2] < [-1]
false
firebug> -2 < -1
true
这是怎么回事,所以我可以纠正我对 javascript 中数组比较意味着的直觉?
最佳答案
数组被转换为字符串,归结为 .join()
,它又用逗号 (,
) 作为分隔符连接元素。
"-1,1" < "0,0" === true
因为 -
(45) 的字符编码小于 0
(48) 的字符编码 ).
另一方面,
"-2" < "-1" === false
因为比较了第二个字符编码(第一个都是-
,所以还没有给出结果),而2
的字符编码(50 ) 比 1
(49) 的字符代码大,因此这会产生 false
。
归结为词法排序(即按字符代码)而不是数字排序,即使元素是数字(因为字符串强制转换)也是如此。
基本上不推荐比较数组。它被隐式定义为字符串比较,但这会产生令人惊讶的结果。
关于javascript 令人惊讶的数组比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58529094/