includes返回布尔值判断子串是否存在,适合条件判断;indexOf返回数字表示首次出现位置(-1为未找到),适合定位和截取。二者返回值类型不同、语义不同,不可互换使用,且起始搜索位置参数含义略有差异。

includes 返回布尔值,判断是否包含子串;indexOf 返回数字,表示首次出现的位置(找不到时为 -1)。
用途不同:一个问“有没有”,一个问“在哪儿”
这是最根本的区别:
-
includes() 只关心“目标子串是否存在”,适合用于条件判断,比如
if (str.includes('abc')) { ... } -
indexOf() 关心“目标子串从哪开始”,适合需要定位、截取或进一步处理的场景,比如
str.substring(0, str.indexOf(' '))获取第一个空格前的内容
返回值类型和含义不同
二者返回值不可互换使用:
-
includes()总是返回true或false,语义清晰,不易误用 -
indexOf()返回索引值(≥ 0 表示找到,-1 表示未找到)。注意:不能直接用于 if 判断,因为if (0)是 false,会导致“找到了却跳过”的错误 - 正确写法应为:
if (str.indexOf('x') !== -1) { ... },而非if (str.indexOf('x'))
都支持起始搜索位置,但参数含义略有差异
两者都可传入第二个参数控制搜索起点:
立即学习“Java免费学习笔记(深入)”;
-
str.includes('a', 2):从索引 2 开始检查是否包含 'a' -
str.indexOf('a', 2):从索引 2 开始查找 'a' 首次出现的位置 - 区别在于:
includes的起始位置只影响“是否查找”,不改变匹配逻辑;indexOf的起始位置直接影响返回值(可能返回 ≥ 起始位置的索引)
兼容性与现代替代建议
历史原因导致兼容性有差异:
-
indexOf支持所有浏览器(包括 IE6+) -
includes是 ES6 新增,IE 完全不支持,需 Babel 或自行 polyfill - 若只需判断存在性,且环境支持,优先用
includes—— 更直观、不易出错 - 若需获取位置、统计次数、配合 slice/substring 使用,必须用
indexOf(或lastIndexOf、search等)










