js中最推荐的字符串截取方法是slice(),它支持负索引、语义清晰且与数组方法一致;substr()已被标准标记为遗留功能,新项目应避免使用;substring()虽未废弃但存在隐式转换和参数自动交换等易错行为。

JS 中最常用也最值得掌握的字符串截取方法是 slice() 和已不推荐使用的 substr()。前者现代、稳定、语义清晰;后者虽仍能运行,但已被标准标记为“遗留功能”,新项目中应避免使用。
slice():推荐首选,支持负索引
slice() 是目前最推荐的截取方式,行为统一、逻辑直观,与数组的 slice() 一致:
- 两个参数:
slice(start, end),截取从start(含)到end(不含)之间的字符 - 只传一个参数:
slice(start)表示从start截取到末尾 - 支持负数:-1 表示最后一个字符,-2 表示倒数第二个……
slice(-4, -1)就是倒数第 4 到倒数第 1 个(不含) - 若
start ≥ end(且均为非负),返回空字符串;不会自动交换参数顺序
substr():已废弃,仅作兼容了解
substr() 的设计逻辑不同,第一个参数是起始位置,第二个参数是**要取多少个字符**(长度),不是结束位置:
-
substr(start, length)—— 例如"hello".substr(1, 3)返回"ell" - 起始位置支持负数(如
-2表示从倒数第 2 位开始) - 长度参数不能为负,若传负值会被当作
0,结果为空字符串 - ECMAScript 规范已明确将其列为 legacy,MDN 和主流 Linter 都会警告,不应在新代码中使用
为什么不用 substring()?它和 slice 有什么区别?
substring() 虽未废弃,但行为有隐式转换,容易引发误解:
- 不支持负数:任何负参数都会被强制转为
0 - 会自动交换参数顺序:如果
start > end,它会悄悄调换两者再截取 - 语义不如
slice()直观,尤其在处理动态索引或边界计算时更易出错
实用小技巧:结合 indexOf 或 lastIndexOf 使用
实际开发中,往往不是按固定下标截取,而是根据内容定位。比如提取 URL 中的文件名:
const url = "https://example.com/path/to/file.js";const filename = url.slice(url.lastIndexOf("/") + 1); // "file.js"- 或取扩展名:
url.slice(url.lastIndexOf(".") + 1)
这类写法清晰、可读性强,且完全依赖 slice(),无需额外判断或兼容处理。











