JavaScript 中的 Array.prototype.sort 为何不总是按预期排序?
在开发中,我们经常用 Array.prototype.sort() 对数组排序,特别是处理数字数组时,默认行为常常让人困惑。比如 [1, 5, 10, 2].sort() 会得到 [1, 10, 2, 5],而不是按数值大小排列。这是因为 sort 默认将元素转换为字符串,再比较 UTF-16 码元序列。更隐蔽的问题出现在比较函数返回值不规范、数组包含 undefined 或稀疏元素,以及现代引擎对稳定排序的差异上。本文从底层规范与常见误区出发,讨论排序不生效的原因、比较函数的正确写法、以及处理数字、对象、多字段排序时的可靠做法,同时涉及性能与稳定性的取舍。