JavaScript中对象与null的比较及排序结果解析
排序结果解释
要理解这个排序结果,得结合JavaScript的类型转换规则和Array.sort()的工作逻辑来拆解:
1. Array.sort()的核心规则
sort()会根据比较函数的返回值调整元素顺序:
- 返回负数:
a排在b前面 - 返回正数:
b排在a前面 - 返回0或NaN:保持元素原相对位置(主流浏览器会将NaN视为0处理)
2. 逐个拆解比较逻辑
针对数组里的元素两两比较,分析每个分支的执行情况:
(1){name: 'a'} vs {name: null}
- 第一个条件
a == null || b == null不成立(两者都是对象,非null) - 触发第二个条件
a.name == null || b.name == null(b.name是null) - 执行
'a' - null:字符串'a'转数字失败得到NaN,null转数字为0,最终结果是NaN - 由于返回NaN被视为0,两者相对位置保持原数组顺序(
{name: 'a'}在前)
(2){name: null} vs null
- 第一个条件
a == null || b == null成立(b是null) - 执行
{name: null} - null:对象转数字得到NaN,null转数字为0,结果是NaN - 返回NaN被视为0,两者保持原数组顺序(
{name: null}在前)
(3){name: 'a'} vs null
- 第一个条件成立(
b是null) - 执行
{name: 'a'} - null:对象转数字得NaN,减0仍为NaN - 返回NaN被视为0,保持原数组顺序(
{name: 'a'}在前)
(4){name: 'dgh'} vs 前面三个元素
- 和
{name: 'a'}比较:进入第三个分支,'dgh'.localeCompare('a')返回正数,所以{name: 'a'}排在{name: 'dgh'}前面 - 和
{name: null}比较:触发第二个条件,执行'dgh' - null得到NaN,视为0,保持原数组顺序({name: null}在前) - 和
null比较:触发第一个条件,执行{name: 'dgh'} - null得到NaN,视为0,保持原数组顺序(null在前)
(5){name: 'zaa'} vs 其他元素
- 和
{name: 'a'}、{name: null}、null比较:结果都是保持原顺序(返回NaN或正数) - 和
{name: 'dgh'}比较:'zaa'.localeCompare('dgh')返回正数,所以{name: 'dgh'}排在{name: 'zaa'}前面
3. 总结
整个排序结果的核心原因是:
- 当比较涉及
null或name: null时,多数情况会返回NaN,而sort()将NaN视为0,保留元素原相对位置 - 正常字符串通过
localeCompare()按字典序排序,所以'a' < 'dgh' < 'zaa'的顺序符合预期
内容的提问来源于stack exchange,提问作者serge
相关产品推荐
相关产品推荐

