substr
和 substring
是两种用于从字符串中提取子字符串的方法,但它们之间有一些关键区别。以下是详细的比较:
1. 语法区别
substr
- 语法:
string.substr(start, length)
- 参数:
start
: 起始索引(从 0 开始)。length
: 要提取的字符数。
- 特点:
- 第二个参数是子字符串的长度,而不是结束索引。
- 如果未提供
length
,则提取从start
到字符串末尾的所有字符。
substring
- 语法:
string.substring(start, end)
- 参数:
start
: 起始索引(从 0 开始)。end
(可选): 结束索引(不包含该索引位置的字符)。
- 特点:
- 第二个参数是结束索引,而不是长度。
- 如果未提供
end
,则提取从start
到字符串末尾的所有字符。 - 如果
start > end
,会自动交换两者的值(某些语言中不支持负索引)。
2. 参数处理的区别
substr
- 允许负值作为
start
参数(在某些语言中,如 JavaScript),表示从字符串末尾开始计算索引。 - 如果
length
为负数或未定义,行为可能因语言而异(如 JavaScript 中会返回空字符串)。
substring
- 不支持负索引。
- 如果
start
或end
为负数,通常会被视为 0。 - 如果
start === end
,返回空字符串。
3. 示例对比
假设字符串为 "Hello, World!"
:
substr
示例
let str = "Hello, World!";
console.log(str.substr(7, 5)); // 输出: "World"
console.log(str.substr(-6, 5)); // 输出: "World" (负索引从末尾开始)
substring
示例
let str = "Hello, World!";
console.log(str.substring(7, 12)); // 输出: "World"
console.log(str.substring(12, 7)); // 输出: "World" (自动交换 start 和 end)
console.log(str.substring(-6, 5)); // 输出: "Hello" (负索引被视为 0)
4. 浏览器/语言支持
substr
:- 在 JavaScript 中已被标记为废弃,不推荐使用。
- 某些现代浏览器可能仍然支持,但未来可能会被移除。
substring
:- 广泛支持,是标准方法,推荐使用。
5. 对比表
| 特性 | substr
| substring
|
|---------------------|-----------------------------------|---------------------------------|
| 参数 | start, length
| start, end
|
| 第二个参数含义 | 子字符串长度 | 结束索引(不包含) |
| 负索引支持 | 部分语言支持(如 JavaScript) | 不支持 |
| 自动交换参数 | 不支持 | 如果 start > end
,自动交换 |
| 推荐使用 | 不推荐(已废弃) | 推荐使用 |
6. 何时使用?
- 优先使用
substring
,因为它是标准方法,兼容性更好,且语义更清晰。 - 如果需要基于长度提取子字符串,可以手动计算结束索引,然后使用
substring
。
示例:
let str = "Hello, World!";
let start = 7;
let length = 5;
let end = start + length;
console.log(str.substring(start, end)); // 输出: "World"
通过以上对比,可以清晰了解 substr
和 substring
的区别,并根据实际需求选择合适的方法。