javascript 令人惊讶的数组比较

标签 javascript arrays comparison

我正在尝试比较 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/

相关文章:

javascript - 定期更新 Angular2 中的 Observable 值

javascript - 对字符串中的所有字符进行排序

javascript - knockout : Order of the bindings evaluation when using click and checked bindings in the same time

c - 将 int 与 char 数组相加

c - 如何检查单词a中单词b中的所有字符(C语言)?

linux - 在 bash 中比较 *nix 时间戳的最佳方法

javascript - Angular Directive(指令)未加载模板,静态应用程序(无服务器)

php - 从数据库中获取两列并呈现为单个数组

java - 按时间升序对 Hashmap 数组进行排序

SQL 等式/不等式与可为空值的比较