javascript令人惊讶的数组比较

ram*_*ion 23 javascript arrays comparison

我想在javascript中比较两个数组.

我想要的是:

a <b⇔∃i≥0st a [i] <b [i]且∀0≤j<i,a [j] = b [j]

因此,非负数的数组可以按需运行:

firebug> [0,1,2,3,4] < [1,0,0]
true
Run Code Online (Sandbox Code Playgroud)

将负数与零进行比较按预期工作:

firebug> [-1, 1] < [0, 0]
true
Run Code Online (Sandbox Code Playgroud)

但将负数与负数进行比较则令人惊讶:

firebug> [-2] < [-1]
false
firebug> -2 < -1
true
Run Code Online (Sandbox Code Playgroud)

这里发生了什么,所以我可以纠正我对javascript中数组比较意味着什么的直觉?

pim*_*vdb 26

数组被转换为一个字符串,该字符串向下.join(),然后以逗号(,)作为分隔符连接元素.

"-1,1" < "0,0" === true
Run Code Online (Sandbox Code Playgroud)

因为字符码-(45)是比小字符码0(48).

另一方面,

"-2" < "-1" === false
Run Code Online (Sandbox Code Playgroud)

因为第二字符代码进行比较(第一均-,所以,不给结果还),而对于字符代码2(50)是更大的比的字符代码1(49),所以这产率false.

它归结为词法排序(即通过字符代码)而不是数字排序,即使元素是数字(因为字符串强制).

基本上不建议比较数组.它被隐式定义为字符串比较,但这可以产生令人惊讶的结果.


Poi*_*nty 7

没有任何形式的JavaScript数组比较与您描述的类似.

在所有情况下发生的事情是,通过将数组连接在一起,您的数组首先被转换为字符串.因此,字符串"-2" 小于字符串"-1",因为字符"2"在字符集中位于"1"之后.类似地," - 1"小于"0,0",因为" - "字符位于数字之前.

您可以自己查看在所有情况下您的比较:

array1 < array2
Run Code Online (Sandbox Code Playgroud)

得到完全相同的结果:

("" + array1) < ("" + array2)
Run Code Online (Sandbox Code Playgroud)

要么:

array1.join(",") < array2.join(",")
Run Code Online (Sandbox Code Playgroud)