【JavaScript中三个截取字符串函数用法和区别比较实例详解】在JavaScript中,处理字符串时经常需要用到截取字符串的功能。常见的三个截取字符串的函数分别是 `substring()`、`substr()` 和 `slice()`。虽然它们都能实现类似的功能,但在具体使用上存在一定的差异。下面将对这三者的用法和区别进行详细比较,并通过实例加以说明。
一、函数概述
| 函数名称 | 功能 | 是否修改原字符串 | 是否支持负数参数 |
| `substring()` | 截取字符串的一部分 | 否 | 否 |
| `substr()` | 截取字符串的一部分 | 否 | 是 |
| `slice()` | 截取字符串的一部分 | 否 | 是 |
二、函数用法与区别详解
1. `substring(startIndex, endIndex)`
- 功能:从 `startIndex` 开始,到 `endIndex` 结束(不包括 `endIndex`),返回一个子字符串。
- 特点:
- 参数为起始索引和结束索引,注意:不包含结束索引。
- 如果 `startIndex > endIndex`,会自动交换位置。
- 不支持负数参数。
示例:
```javascript
let str = "Hello World";
console.log(str.substring(0, 5)); // 输出 "Hello"
console.log(str.substring(6, 11)); // 输出 "World"
console.log(str.substring(5, 0)); // 输出 "Hello"(自动交换)
```
2. `substr(startIndex, length)`
- 功能:从 `startIndex` 开始,截取长度为 `length` 的字符串。
- 特点:
- 第一个参数是起始索引,第二个参数是截取的字符数。
- 支持负数参数,负数表示从字符串末尾开始计算。
- 与 `substring()` 不同的是,它以“长度”作为第二参数,而不是“结束索引”。
示例:
```javascript
let str = "JavaScript";
console.log(str.substr(0, 4)); // 输出 "Java"
console.log(str.substr(4, 3)); // 输出 "Scr"
console.log(str.substr(-3, 2)); // 输出 "pt"(从倒数第3个字符开始,截取2个)
```
3. `slice(startIndex, endIndex)`
- 功能:从 `startIndex` 开始,到 `endIndex` 结束(不包括 `endIndex`),返回一个子字符串。
- 特点:
- 与 `substring()` 类似,但支持负数参数。
- 负数表示从字符串末尾向前计数(如 `-1` 表示最后一个字符)。
- 与 `substring()` 不同的是,`slice()` 更接近数组的 `slice()` 方法。
示例:
```javascript
let str = "JavaScript";
console.log(str.slice(0, 4)); // 输出 "Java"
console.log(str.slice(4, 7)); // 输出 "Scri"
console.log(str.slice(-3)); // 输出 "ipt"(从倒数第三个字符开始到最后)
console.log(str.slice(-5, -1)); // 输出 "ipt"(从倒数第五个字符到倒数第二个)
```
三、三者对比总结
| 特性 | `substring()` | `substr()` | `slice()` |
| 是否包含结束索引 | ❌(不包含) | ❌(不包含) | ❌(不包含) |
| 支持负数参数 | ❌ | ✅ | ✅ |
| 参数类型 | 起始索引 + 结束索引 | 起始索引 + 长度 | 起始索引 + 结束索引 |
| 是否自动调整参数顺序 | ✅(当 `start > end` 时) | ❌ | ❌ |
| 与数组 `slice()` 行为一致 | ❌ | ❌ | ✅ |
四、实际应用场景建议
- `substring()`:适合需要精确控制起止范围的场景,尤其是不需要负数参数的情况。
- `substr()`:适合需要根据起始位置和长度来截取字符串的情况,尤其在处理动态长度时更灵活。
- `slice()`:推荐用于大多数情况,因为它支持负数参数,且行为更符合现代编程习惯。
五、总结
虽然 `substring()`、`substr()` 和 `slice()` 都可以用来截取字符串,但它们在参数含义、是否支持负数、以及行为细节上有明显不同。理解这些差异有助于我们在实际开发中选择最合适的函数,提高代码的可读性和健壮性。


