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
.
它归结为词法排序(即通过字符代码)而不是数字排序,即使元素是数字(因为字符串强制).
基本上不建议比较数组.它被隐式定义为字符串比较,但这可以产生令人惊讶的结果.
没有任何形式的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)