javascript中截取字符串应优先用slice而非substring,因slice支持负数索引、不自动交换参数、行为可预测;substring会将负数转为0且自动调换参数顺序,易引发误判;substr已废弃。

JavaScript中用 slice 和 substring 截取字符串时,关键不是“哪个更好”,而是“它们行为不同,选错容易出错”。真正安全的截取,得先理解两者对负数、越界、参数顺序的处理差异,再按需选用。
slice:按索引偏移,负数从末尾算,不交换参数
slice(start, end) 是最符合直觉的安全选择。它始终从左往右截取,start 和 end 都支持负数(-1 表示最后一个字符),且不会自动交换参数顺序。
- 如果 start > end,返回空字符串(不报错,但结果为空)
- 超出范围的索引会被自动修正:小于 0 取 0,大于长度取字符串长度
- 推荐用于大多数场景,尤其涉及动态计算起始/结束位置时
"hello".slice(-3, -1) → "ll"(从倒数第3个到倒数第1个,不包含后者)"abc".slice(5, 2) → ""(start > end,直接返回空串)
substring:自动归正参数,负数转为0,易误判边界
substring(start, end) 会把所有负数参数强制转为 0,并且自动交换 start 和 end 的顺序(如果 start > end,内部会调换)。这看似“友好”,实则隐藏陷阱。
- 任何负数参数(如 -2)都会变成 0,导致意外截取开头
- 参数顺序被自动调整,可能掩盖逻辑错误
- 仅适合明确知道两个非负整数、且不关心方向的简单截取
"hello".substring(-2, 3) → "hel"(-2 被当作 0,等价于 substring(0, 3))"hello".substring(4, 1) → "ell"(参数被自动调换为 substring(1, 4))
安全截取的通用做法
避免依赖函数默认“容错”行为,主动做边界控制更可靠:
- 截取前先用
Math.max(0, Math.min(str.length, index))限制索引范围 - 需要支持负数索引时,统一用
slice,它语义清晰、行为可预测 - 若必须用
substring,确保传入的两个参数都是非负整数,且 start ≤ end - 对用户输入或动态计算的索引,加一层校验再调用方法
替代方案:substr 已废弃,别用
substr(start, length) 虽然直观(第二个参数是长度而非结束索引),但它已被标准标记为废弃(deprecated),现代代码应避免使用。用 slice(start, start + length) 完全可以替代,且更标准、更易维护。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











