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()会自动交换两个参数,按小值在前、大值在后的方式截取
例如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
"abc".slice(2, 0)→ "" -
"abc".substring(2, 0)→ "ab"(等价于.substring(0, 2)) -
"abc".substring(3, 1)→ "ab"(自动调整为.substring(1, 3))
都支持省略第二个参数,且都不修改原字符串
两者都遵循“左闭右开”原则(包含起始位置,不包含结束位置),也都不改变原始字符串,只返回新字符串。
立即学习“Java免费学习笔记(深入)”;
- 省略第二个参数时,都表示截取到末尾:
"hello".slice(2)和"hello".substring(2)都返回 "llo" - 若任一参数超出字符串长度,两者都会自动按字符串实际长度截断,不会报错
- 都不支持正则表达式,只接受数字索引
选择建议
如果需要倒序定位(比如取后几位),优先用 slice();
如果传参顺序不确定、或希望自动容错(比如用户输入可能颠倒起止位置),substring() 更省心。
现代开发中推荐优先使用 slice(),语义更清晰、行为更可预测,尤其配合负索引时逻辑直观。

















