slice()和substring()对负数参数及参数顺序处理不同:slice()支持负索引(从末尾计数)且起始大于结束时返回空字符串;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 到倒数第一个之前) -
"hello".substring(1, -1)→ "h"(-1 变成 0,等价于.substring(1, 0),再自动交换为.substring(0, 1))
起始位置大于结束位置时行为相反
当第一个参数比第二个大时,两者处理方式完全相反:
-
slice()直接返回空字符串"" -
substring()会自动交换两个参数,按小值在前、大值在后的方式截取
例如:
-
"abc".slice(2, 0)→ "" -
"abc".substring(2, 0)→ "ab"(等价于.substring(0, 2)) -
"abc".substring(3, 1)→ "ab"(自动调整为.substring(1, 3))
都支持省略第二个参数,且都不修改原字符串
两者都遵循“左闭右开”原则(包含起始位置,不包含结束位置),也都不改变原始字符串,只返回新字符串。
- 省略第二个参数时,都表示截取到末尾:
"hello".slice(2)和"hello".substring(2)都返回 "llo" - 若任一参数超出字符串长度,两者都会自动按字符串实际长度截断,不会报错
- 都不支持正则表达式,只接受数字索引
选择建议
如果需要倒序定位(比如取后几位),优先用 slice();
如果传参顺序不确定、或希望自动容错(比如用户输入可能颠倒起止位置),substring() 更省心。
现代开发中推荐优先使用 slice(),语义更清晰、行为更可预测,尤其配合负索引时逻辑直观。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











