最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何用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 大写特殊字符(如德语 ß)。另外注意:如果原字符串或搜索词可能为 null 或 undefined,得提前 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。
相关文章
- 崩坏星穹铁道垃美西斯二世成就攻略 06-18
- Cursor模型选择要点:任务类型与上下文限制说明 06-18
- Cursor国内使用限制:网络、账号与功能可用性说明 06-18
- Cursor官网访问入口:域名、镜像站与网络环境说明 06-18
- 崩坏星穹铁道星旅寻影第二天拍照攻略 06-18
- Cursor免费替代方案:功能差异与使用限制说明 06-18