JavaScript sort()函数工作原理探究:负数数组排序异常问题
JavaScript sort()函数的排序逻辑解析
为什么默认排序结果不符合预期?
JavaScript的sort()方法默认按照字符串的Unicode编码顺序排序,而非直接比较数值大小。
当你调用A.sort()时,数组中的每个元素会被先转换为字符串再进行比较:
- 原数组元素:
-1、-3、-2、0 - 转换为字符串后:
"-1"、"-3"、"-2"、"0"
Unicode编码的比较规则是逐字符对比:
- 首先比较第一个字符:
'-'的Unicode码点是45,'0'是48,所以所有以'-'开头的字符串都排在"0"前面。 - 对于以
'-'开头的字符串,继续比较第二个字符:'1'的码点是49,'2'是50,'3'是51。码点越小的字符串排在越前面,所以顺序为"-1"<"-2"<"-3"。
最终排序后的数组就是[-1, -2, -3, 0],和你实际看到的输出一致。
如何实现数值排序?
要按数值大小排序,需要给sort()传入一个比较函数,通过自定义逻辑来控制排序顺序:
const A = [-1, -3, -2, 0]; A.sort((a, b) => a - b); console.log(A); // 输出 [-3, -2, -1, 0]
比较函数的逻辑:
- 如果
a - b < 0,则a排在b前面(升序) - 如果
a - b > 0,则b排在a前面 - 如果
a - b = 0,两者位置不变
如果需要降序排序,只需把比较函数改成(a, b) => b - a即可。
内容的提问来源于stack exchange,提问作者Error404
相关产品推荐
相关产品推荐

