最新下载
热门教程
- 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。
相关文章
- 华为Mate 80 Pro Max风驰版与华为畅享90 Pro Max重新定义流畅体验 08-02
- 旅居魔女与她的毕业课题全结局解锁攻略 08-02
- 迅雷浏览器官网入口-迅雷浏览器网页版官方入口 08-02
- 小鸡漫画官方客户端下载入口在哪?小鸡漫画下载含安装教程 08-02
- 夸克网盘网页版入口-夸克浏览器云存储服务登录直达 08-02
- 如何申请163邮箱账号注册 08-02