JavaScript 提供了 substr()、substring() 和 slice() 三种常见的字符串截取方法。它们都能从字符串中取出一部分内容,但参数含义、对负数的处理方式和推荐程度有所不同。
这三种方法都不会修改原字符串,而是返回一个新字符串。
1. substr(start, length)
substr() 从指定位置开始,截取指定长度的字符。
ini
const str = "JavaScript";
str.substr(4, 6); // "Script"
参数含义:
start:开始位置,支持负数。负数表示从字符串末尾倒数。length:要截取的字符数量,可选。省略时截取到末尾。
rust
const str = "JavaScript";
str.substr(4); // "Script"
str.substr(-6, 6); // "Script"
注意:substr() 已被标记为遗留特性(legacy feature) ,虽然许多环境仍支持它,但新代码通常不建议使用。
2. substring(start, end)
substring() 从 start 开始截取,到 end 之前结束。end 不包含在结果中。
ini
const str = "JavaScript";
str.substring(4, 10); // "Script"
参数含义:
start:开始位置。end:结束位置,不包含该位置。省略时截取到末尾。- 参数为负数时,会按
0处理。 - 如果
start大于end,两个参数会自动交换。
vbscript
const str = "JavaScript";
str.substring(4, 10); // "Script"
str.substring(10, 4); // "Script",参数自动交换
str.substring(-2, 4); // "Java",负数按 0 处理
这种自动交换参数的行为有时会让结果不符合直觉,使用时需要留意。
3. slice(start, end)
slice() 同样从 start 开始,截取到 end 之前结束。
ini
const str = "JavaScript";
str.slice(4, 10); // "Script"
它与 substring() 的主要区别在于对负数的处理:
- 负数表示从字符串末尾倒数。
start大于end时,不会交换参数,而是返回空字符串。- 省略
end时,截取到末尾。
python
const str = "JavaScript";
str.slice(-6); // "Script"
str.slice(4, 10); // "Script"
str.slice(10, 4); // ""
三者对比
| 方法 | 参数含义 | 负数处理 | start > end 时 |
推荐程度 |
|---|---|---|---|---|
substr(start, length) |
起始位置、截取长度 | start 可从末尾倒数 |
不适用 | 不建议用于新代码 |
substring(start, end) |
起始位置、结束位置(不包含) | 负数按 0 处理 |
自动交换参数 | 可用 |
slice(start, end) |
起始位置、结束位置(不包含) | 从末尾倒数 | 返回空字符串 | 通常优先推荐 |
一个例子看清区别
vbscript
const str = "JavaScript";
console.log(str.substr(4, 3)); // "Scr"
console.log(str.substring(4, 7)); // "Scr"
console.log(str.slice(4, 7)); // "Scr"
这个例子中三者结果相同,但参数含义不同:
substr(4, 3):从位置4开始,取3个字符。substring(4, 7):从位置4取到位置7之前。slice(4, 7):同样从位置4取到位置7之前。
如何选择?
大多数情况下,优先使用 slice():
ini
const text = "JavaScript";
const result = text.slice(4, 10);
它的参数含义清晰,并且支持负数索引,适合从字符串末尾截取内容。substring() 在某些场景下也很有用,尤其是你明确希望负数按 0 处理时。对于旧代码中的 substr(),可以继续理解和维护,但编写新代码时通常应避免使用。
记忆口诀:
substr:第二个参数是"长度"。substring:第二个参数是"结束位置",负数按0处理,参数会交换。slice:第二个参数是"结束位置",负数从末尾倒数,参数不交换。