JavaScript中Array.sort()是否为稳定排序?实例验证疑问
关于Array.sort()的稳定性问题解答
嘿,这俩问题问到点子上了,我来给你讲明白:
1. Array.sort()是否始终保持元素的原始相对顺序?
答案是:从ES2019(ECMAScript 2019)开始,规范要求Array.sort()必须是稳定排序,但在这之前的JavaScript环境里,这个行为是没有被标准强制规定的——不同浏览器/引擎可能有不同的实现,有些是稳定的,有些不是。
所谓“稳定排序”,简单说就是:当两个元素在排序规则下被判定为相等时,它们在原数组里的相对位置会被保留下来。
不过现在咱们日常用的现代浏览器(Chrome、Firefox、Edge等)和Node.js环境,基本都已经支持ES2019及以上的标准了,所以在这些环境里,sort()是稳定的。但如果你的代码需要兼容非常老旧的环境(比如IE11及更早),那就要注意,这种情况下sort()的稳定性是没法保证的。
2. 给定数组排序后,相等元素是否必然保持原顺序?
咱们来看你给出的例子:
let array = [ ['whatever', 3], ['1st', 1], ['2nd', 1] ] array.sort((a,b) => a[1] - b[1])
在符合ES2019及以上标准的环境里,必然会得到[ [ '1st', 1 ], [ '2nd', 1 ], [ 'whatever', 3 ] ]。原因很简单:['1st',1]和['2nd',1]在排序规则下比较的结果是0(因为1-1=0),属于“相等”的情况,稳定排序会保留它们在原数组中的先后顺序——原数组里['1st',1]在['2nd',1]前面,排序后也会保持这个顺序。
但还是要再提醒一句:如果是在ES2019之前的老旧环境里,这个结果就没法100%保证了,有些旧引擎可能会把这两个元素的顺序打乱。不过现在这种场景已经很少见啦。
内容的提问来源于stack exchange,提问作者d9ngle
相关产品推荐
相关产品推荐

