startsWith和endsWith是ES6引入的字符串方法,分别判断前缀和后缀:startsWith按fromIndex截取比对,负索引转有效起点,空串恒真;endsWith按length截取前缀比对,负length转0;二者均区分大小写、不支持正则、按UTF-16计数。

startsWith 和 endsWith 是 JavaScript 中用于判断字符串前缀和后缀的两个原生方法,行为规范由 ECMAScript 标准定义,关键在于它们的参数处理、边界逻辑和 Unicode 兼容性。
startsWith 的判定逻辑
该方法检查字符串是否以指定子串开头,返回布尔值。其判定严格基于字符索引位置,不进行正则匹配或模糊比较:
- 若第二个参数 fromIndex 被提供,则从该索引位置开始“截取主字符串”再进行比对(即等价于
str.slice(fromIndex).startsWith(searchString)); - 若 fromIndex 大于等于字符串长度,直接返回 false;
- 若 fromIndex 为负数,会被自动转换为
Math.max(0, str.length + fromIndex),即从末尾向前偏移后取有效起始点; - 空字符串
''对任意非空字符串调用startsWith('')恒为 true(符合“空序列是任何序列前缀”的数学约定)。
endsWith 的判定逻辑
该方法判断字符串是否以指定子串结尾,同样返回布尔值,但索引逻辑与 startsWith 不对称:
- 它只接受一个可选的第二个参数 length,表示“用于比对的主字符串长度上限”,即等价于
str.slice(0, length).endsWith(searchString); - 若 length 省略,则默认使用整个字符串长度;
- 若 length 小于子串长度,直接返回 false;
- 若 length 为负数,会被转为
0,此时因比对长度为 0,仅当 searchString 也为空时才返回 true。
共同注意事项
两个方法均遵循标准字符串比较规则:
立即学习“Java免费学习笔记(深入)”;
- 区分大小写,不自动忽略空白或 Unicode 规范化形式;
- 不支持正则表达式,传入 RegExp 会抛出 TypeError;
- 对
null或undefined调用会触发隐式 ToString 转换(如String(null)得"null"),但建议显式类型校验; - 在涉及代理对(surrogate pairs)或组合字符(如带重音符号的字母)时,按 UTF-16 编码单元计数,而非用户感知的“字符数”——例如
'??'.length === 4,'??'.startsWith('?')实际为 false。
兼容性与 Polyfill 提示
这两个方法自 ES6(ES2015)起被标准化,现代浏览器及 Node.js 4+ 均原生支持。若需兼容旧环境:
- 可用
str.indexOf(searchString) === 0替代 startsWith(注意处理 fromIndex); - 可用
str.lastIndexOf(searchString) === str.length - searchString.length替代 endsWith(注意处理 length 参数); - 推荐使用成熟的 polyfill 库(如 core-js)而非手写,以正确处理边缘情况(如 NaN、Symbol 输入等)。










