一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何用String.prototype.includes替代indexOf实现更直观的包含判断

时间:2026-06-15 09:33:59 编辑:袖梨 来源:一聚教程网

includes()语义清晰、返回布尔值,但仅支持字符串参数,传正则会报错;忽略大小写需手动转小写并防null/undefined;性能与indexOf相当,但不返回索引;IE及低版Node不支持,需polyfill或兼容处理。

includes比indexOf更直观,但要注意它不支持正则

直接用 includes() 判断子串存在性,语义清晰、返回布尔值,省去跟 -1 比较的步骤。但它的能力边界很明确:只接受字符串参数,传 RegExp 会直接抛错 TypeError: First argument to String.prototype.includes must be a string

常见错误是下意识把原本给 indexOf() 的正则对象(比如 /abc/g)直接塞进 includes()——这行不通。需要先用 test()match() 做正则匹配。

大小写敏感是默认行为,忽略大小写得自己处理

includes() 默认区分大小写,不像某些工具库的 contains() 可能带选项。要忽略大小写,最稳妥的做法是统一转成小写再比:

const str = "Hello World";str.toLowerCase().includes("hello"); // true

不建议用 toUpperCase() 替代,除非你明确知道输入不含 Unicode 大写特殊字符(如德语 ß)。另外注意:如果原字符串或搜索词可能为 nullundefined,得提前 guard,否则调用 toLowerCase() 会报错。

  • 用前检查 typeof str === 'string'
  • 或用空值合并:(str ?? '').toLowerCase().includes(search)

性能差异微乎其微,但 indexOf 能定位位置

单纯判断“有没有”,includes()indexOf() !== -1 在 V8 等主流引擎里底层实现几乎一致,别指望靠换函数优化性能。真有差异,也是语义和可读性层面的。

但如果后续还要用到匹配位置(比如截取、替换、高亮),就别硬套 includes()——它不返回索引。这时候保留 indexOf() 更自然:

const pos = str.indexOf("target");if (pos !== -1) {  console.log(`found at ${pos}`);  return str.slice(pos);}

IE 不支持 includes,必须考虑兼容性兜底

IE 完全不认 includes(),哪怕加了 Babel 转译也不会自动 polyfill(因为它是原型方法,不是语法)。上线前务必确认目标环境,或手动补:

if (!String.prototype.includes) {  String.prototype.includes = function(search, start) {    return this.indexOf(search, start) !== -1;  };}

这个 polyfill 覆盖了 start 参数,行为与标准一致。不过如果项目已用 Lodash,直接上 _.includes(str, search) 更省心——它内部已处理类型和兼容性。

真正容易被忽略的是 SSR 场景:Node.js 早于 v4.0.0 也不支持 includes(),如果服务端渲染时用了它,低版本 Node 直接 crash。

热门栏目