You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中布尔值排序:该比较器写法是否正确?

布尔值排序代码的正确性验证

我找到如下布尔值排序代码:

const sorted = things.sort((left, right) => { return Number(!!left.current) - Number(!!right.current); });

请问这种排序布尔值的方式是否正确?

这种排序方式完全正确,而且是一种很稳妥的处理方式,我来拆解下它的工作逻辑:

  • 第一步:!!left.current 和 !!right.current
    这一步是把current属性的任意值强制转换为布尔类型。不管current是undefined、null、0、空字符串这类假值,还是对象、非空字符串、正数这类真值,!!都会统一把它们转成true或false,避免了不同类型值直接比较可能出现的潜在问题。

  • 第二步:Number(...)
    JavaScript里Number(true)会返回1,Number(false)返回0。把布尔值转成数字后,就能通过减法得到排序所需的差值:

    • 如果left.current是假值、right.current是真值:0 - 1 = -1,此时left会被排在right前面
    • 如果两者都是假值或都是真值:0-0=0或1-1=0,元素相对位置保持不变(注:Array.sort是不稳定排序,但同值元素的顺序不影响布尔值排序的最终结果)
    • 如果left.current是真值、right.current是假值:1 - 0 = 1,此时right会被排在left前面

最终效果是:所有current为假值的元素会排在数组前面,真值的元素排在后面。如果想反过来让真值在前,只需要调换减法的顺序即可:

const sorted = things.sort((left, right) => { 
  return Number(!!right.current) - Number(!!left.current); 
});

举个实际例子,假设things是:

const things = [
  { current: 'active' },
  { current: null },
  { current: false },
  { current: 123 }
];

用你的代码排序后会得到:

[
  { current: null },
  { current: false },
  { current: 'active' },
  { current: 123 }
]

完全符合预期。


内容的提问来源于stack exchange,提问作者dagda1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:49:40