Javascript 有人能解释数组排序的这种奇怪行为吗?;

Javascript 有人能解释数组排序的这种奇怪行为吗?;,javascript,arrays,sorting,Javascript,Arrays,Sorting,我有一个这样的数组 a=[0、“-”、“-”、“-”、“-”、“-”、-0.2、-0.05、0.25、0.47、0.875] 请注意,这个数组中有一些“-”,只有这个字符串出现,左边是数字 现在我对这个数组应用排序,就像 a=[0、“-”、“-”、“-”、“-”、“-”、-0.2、-0.05、0.25、0.47、0.875]; console.log(a.sort((a,b)=>(+a | |-无穷大)-(+b |-无穷大))数组[0,“-”]和[“-”,0]虽然不同,但都根据您定义的排序规则

我有一个这样的数组

a=[0、“-”、“-”、“-”、“-”、“-”、-0.2、-0.05、0.25、0.47、0.875]

请注意,这个数组中有一些“-”,只有这个字符串出现,左边是数字

现在我对这个数组应用排序,就像

a=[0、“-”、“-”、“-”、“-”、“-”、-0.2、-0.05、0.25、0.47、0.875];
console.log(a.sort((a,b)=>(+a | |-无穷大)-(+b |-无穷大))
数组
[0,“-”]
[“-”,0]
虽然不同,但都根据您定义的排序规则正确地“排序”

请理解javascript
sort
方法不是稳定的排序。如果要排序的列表中有多个等效项,则这些等效项将分组在一起。但是,在这些组中的每个组中,顺序都是未定义的

您正在使用的比较函数将
0
和“-”定义为等效

+0
是错误的,因此
+0 | |-Infinity
将返回
-Infinity

+“-”
解析为
NaN
,这也是错误的,因此
+“-”|-Infinity
将返回
-Infinity

降序排序时,
0
恰好位于
-
之前,这只是一个实现细节。在另一个javascript引擎上尝试,或者在下一次Chrome更新后再次尝试,您可能会得到不同的结果,但仍然是正确的


如果希望将0视为一个数字(获得排序结果
['-',-0.2,-0.05,0,0.25,0.48,0.875]
),则可以使用以下方法:

a.sort(
    (l,r ) => 
        (typeof(l) === 'number' ? l : -Infinity) -
        (typeof(r) === 'number' ? r : -Infinity)
);


0
NaN
都是错误的,因此
(+a | |-无穷大)
不是正确的方法。预期的结果是什么?这些数组都不是直观排序的。@sebastian simon你说得对。从ES10(一个月前完成)开始,数组#排序要求是稳定的。当然,这需要一些时间才能变得可靠,尤其是在浏览器中。