slice和substring核心区别在于负数处理与参数顺序:slice支持负索引(从末尾计数)且end为不包含右边界,start>end时返回空串;substring将负数转0且自动交换start/end顺序。

JavaScript中slice和substring都能截取字符串,但参数处理逻辑不同,容易混淆——关键区别在于负数参数的解释方式和第二个参数是否表示“结束位置”。
slice(start, end):支持负数索引,end不包含
slice以数组式逻辑处理索引:负数从字符串末尾倒数(-1 是最后一个字符),start 和 end 都是真实索引位置,且 end 是**不包含**的右边界。如果 end 省略,则截取到末尾;如果 start > end,返回空字符串。
-
"hello".slice(1, 4)→"ell"(索引 1 到 3) -
"hello".slice(-4, -1)→"ell"(等价于slice(1, 4)) -
"hello".slice(3, 1)→""(start > end,直接返回空串)
substring(start, end):负数转0,自动交换顺序
substring会把所有负数参数强制转为 0,且如果 start > end,它会**自动交换两个参数值**再计算。也就是说,它只关心范围,不关心谁先谁后。
-
"hello".substring(1, 4)→"ell" -
"hello".substring(-2, 3)→"hel"(-2 被当作 0,即substring(0, 3)) -
"hello".substring(4, 1)→"ell"(自动变成substring(1, 4))
实际使用建议
多数场景推荐用 slice:语义清晰、行为可预测,尤其涉及负索引(如取后几位)时更自然;若需兼容老旧代码或明确依赖“参数顺序无关”的特性,才考虑 substring。注意:substr 已被废弃,不要使用。
立即学习“Java免费学习笔记(深入)”;
另外,三者都不修改原字符串,均返回新字符串。










