Angular2中Array sort在移动端Chrome浏览器表现异常
问题原因及修复方案
你的排序函数逻辑存在运算符优先级错误,这导致不同JS引擎(桌面/移动端Chrome的V8引擎实现存在差异)对比较函数的处理不一致,最终出现排序结果反转的情况。
错误点拆解
原代码中的三元表达式:
return a == b ? 0 : a < b || a == null ? -1 : 1;
由于||的优先级低于三元运算符?:,实际执行顺序会被解析为:
return a == b ? 0 : (a < b) || (a == null ? -1 : 1);
这完全偏离了你原本想表达的「如果a小于b或者a为null则返回-1,否则返回1」的逻辑,这种不稳定的比较逻辑会让不同JS引擎的排序算法(比如排序策略、稳定性处理)输出不同结果。
修复方案
方案1:修正运算符优先级(加括号)
用括号包裹需要优先判断的条件,确保逻辑符合预期:
const words = ['apple', 'banana', 'zoom'] words.sort((first, second) => { const a = first; const b = second; return a == b ? 0 : (a < b || a == null) ? -1 : 1; });
方案2:简化逻辑(推荐)
如果只是普通字符串排序,直接使用字符串原生的localeCompare更可靠,还能兼容多语言排序场景:
const words = ['apple', 'banana', 'zoom'] words.sort((a, b) => a.localeCompare(b));
如果需要处理null值,可调整为:
words.sort((a, b) => { if (a == null) return -1; if (b == null) return 1; return a.localeCompare(b); });
内容的提问来源于stack exchange,提问作者Aliaksandr Vysotskiy
相关产品推荐
相关产品推荐

