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

为何Array.prototype.includes未采用二分查找算法?

为什么Array.prototype.includes不使用二分查找?

嘿,这个问题问到点子上了!咱们从几个核心角度来掰扯清楚:

  • 二分查找有个硬前提:数组必须是有序的
    includes的设计目标是能处理任意数组——不管你是有序的、乱序的,甚至里面混着各种类型的元素,它都得能正常工作。如果includes底层用二分查找,那用户在调用前必须先把数组排序,但排序本身会带来额外的开销(时间复杂度O(n log n)),甚至还可能改变原数组的顺序(除非你先拷贝一份),这完全违背了includes“简单判断存在性”的初衷。

  • 通用性优先,避免使用门槛
    JS的API设计一直倾向于“开箱即用”,includes就是给开发者提供一个最直观的工具:给我一个数组和元素,告诉我有没有就行。要是换成二分查找,那开发者每次用之前都得记着“先排序”,这无疑增加了使用成本,反而不如线性遍历直接。

  • 性能的实际权衡
    二分查找的O(log n)优势只在超大有序数组里才明显。但大多数日常开发场景中,数组的长度都不大,线性遍历的O(n)开销其实可以忽略不计,甚至比“排序+二分”的总开销更小。而且JS引擎早就对数组的线性遍历做了大量优化,实际运行效率并不差。

顺便提下你的示例代码

你写的这个BinarySearch函数其实并没有用到二分查找哦,内部还是调用了includes(本质是线性遍历)。如果真要实现二分查找,得先确保数组是有序的,然后手动写二分逻辑,比如:

function binarySearch(names, requiredName) {
  // 假设names已经按字典序排序完成
  let left = 0;
  let right = names.length - 1;
  
  while (left <= right) {
    const midIndex = Math.floor((left + right) / 2);
    const currentName = names[midIndex];
    
    if (currentName === requiredName) {
      return true;
    } else if (currentName < requiredName) {
      left = midIndex + 1;
    } else {
      right = midIndex - 1;
    }
  }
  
  return false;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:20:31