ES9 中的 Array.prototype.sort() 算法变化
在 ECMAScript 2018 中,Array.prototype.sort() 算法进行了一些改变,以便更好地支持排序场景。这篇文章将详细说明这些变化及其意义。
改变1:稳定排序
在 ECMAScript 2018 中,Array.prototype.sort() 算法现在是稳定排序。这意味着它能够保留等价元素之间的相对顺序。以前,如果两个元素在比较中相等,它们的相对顺序可能会发生变化。现在,样例代码如下:
const arr = [{ name: 'John', age: 20 }, { name: 'Bob', age: 20 }, { name: 'Alice', age: 22 }]; arr.sort((a, b) => a.age - b.age); console.log(arr); // [{ name: 'John', age: 20 }, { name: 'Bob', age: 20 }, { name: 'Alice', age: 22 }]
在这个例子中,我们可以看到两个年龄相等的元素{ name: 'John', age: 20 }
和{ name: 'Bob', age: 20 }
的相对顺序被保留。这意味着排序算法始终会按照元素数组中的顺序进行排序,即使它们等价。
改变2:Asymptotic Complexity
Array.prototype.sort() 算法现在有一个指定的渐近复杂度,即O(n log n)
。以前,Array.prototype.sort() 的实现可能具有不同的渐近复杂度(通常是O(n log n)
),但这是未指定的。这个指定的渐近复杂度是一项重要的改变,它使得开发人员更容易预测和理解排序算法的性能。
改变3:确定性
从 ECMAScript 2018 开始,Array.prototype.sort() 根据特定条件是确定性的。给定相同的元素类型和相同的 compare function,排序结果必须始终相同。在一些老版本的 JavaScript 引擎中,特别是在 WebKit 的早期版本中,排序结果是非确定性的。
最后补充一下,新的排序算法改变对于前端开发人员来说可能并不是一个重大的改变。但是,从一个更广泛的视角来看,它是值得关注的一个改变。这款改善排序算法的 ECMAScript 改变,表明了在这个编程语言中,发展人员仍在努力提高标准库的效率和可预测性。
结论
Array.prototype.sort() 算法的改变是一个较小的改变,对开发人员的现实生活没有主要影响。但它表明了 ECMAScript 仍在努力通过指定不确定的行为和受不确定性影响的算法的渐近复杂度等方式来提高标准库。这提供了一种更可预测和灵活的生态系统。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/673045caeedcc8a97c917e9a