slice()和substring()核心区别在于负数参数处理及参数顺序:slice()支持负索引(从末尾计数)且start>end时返回空字符串;substring()将负数转0并自动交换参数顺序。

JavaScript中slice()和substring()都能截取字符串,但处理负数参数和参数顺序的方式不同,容易出错。关键区别在于:负数索引的解释方式不同,以及当起始位置大于结束位置时的行为不同。
负数参数的处理方式不同
slice()支持负数索引,表示从字符串末尾开始计数(-1 是最后一个字符,-2 是倒数第二个……);substring()会把负数自动转为 0。
-
"hello".slice(-3)→"llo" -
"hello".substring(-3)→"hello"(等价于substring(0)) -
"hello".slice(1, -1)→"ell"(从索引1到倒数第1个之前) -
"hello".substring(1, -1)→"h"(负数被转为0,等价于substring(1, 0))
参数大小顺序影响结果不同
当第一个参数大于第二个参数时:slice()直接返回空字符串;substring()会自动交换两个参数再截取。
-
"abc".slice(2, 0)→""(空字符串) -
"abc".substring(2, 0)→"ab"(等价于substring(0, 2)) -
"abc".substring(3, 1)→"ab"(自动调整为substring(1, 3))
都不修改原字符串,且不支持正则
两者都是纯函数式操作,返回新字符串,原字符串保持不变。它们只接受数字索引,不能传入正则表达式或条件逻辑。
立即学习“Java免费学习笔记(深入)”;
-
str.slice(start, end):end不包含,可为负数 -
str.substring(start, end):end不包含,负数变0,参数自动排序 - 若只需从某位置截到末尾,两者都可省略第二个参数:
slice(2)和substring(2)效果一致
推荐使用 slice() 的场景
日常开发中更建议优先用 slice(),语义清晰、行为可预测,尤其适合处理用户输入、API响应等可能含不确定长度的字符串。
- 取文件扩展名:
filename.slice(filename.lastIndexOf(".") + 1) - 安全截断长文本:
text.slice(0, 100) + (text.length > 100 ? "..." : "") - 兼容性好,所有现代浏览器及IE9+均支持










