正如已经问过的:在 JavaScript 中,排序函数如何与比较函数一起工作?如果我有一个数组,并且我现在执行 array.sort(compare),书中写道,如果比较函数...
正如已经问过的:JavaScript 中的 sort 函数如何工作,以及 compare
函数如何工作?如果我有一个数组, array.sort(compare)
现在书上写着,如果 compare
函数返回 a-b
(数组的两个索引),那么它会根据结果是大于 0、小于 0 还是等于 0 来工作。但是,它究竟是如何工作的呢?我无法弄清楚。
我认为可能是这样(嗯,我不确定。)
假设该函数 compare(a,b)
是比较函数。它返回 c
。假设我们要对数组中的条目进行排序 N
以获取排序结果数组 M
.
我不知道确切的排序算法,并且如果 c
既不是 (a-b)
也不是 (b-a)
(例如,如果 c
是 "b-2"
, "a+b"
或其他一些表达式),不同的浏览器甚至会返回不同的结果。
但根据 ECMA-262
,排序结果应该是这样的:
a,b 可以是任意两个索引。这意味着我们实际上将一个有序对传递给了比较函数。 eg: (0,1),(1,4), or even (2,0) , (2,1)
.
ECMAScript 语言规范规定结果应该具有此属性: (a,b)
是传递给比较函数的有序对。
c
(函数返回的内容)小于零,则 M(a)< M(b)
必须满足。
并且规范并未提及如果 c 为零或大于零会发生什么。
我不确定这是否正确。至少这可以很容易地解释为什么当 c
是时 "a-b"
,条目按数字和升序排序,以及为什么当 c
是时 "b-a"
,条目按相反顺序排序。
浏览器的 js 引擎是否实际上不是严格按照 ECMA-262 设计的,或者我完全错了?
参考
ECMA-262第五版(查看第129-130页)