应优先使用slice():支持负索引、逻辑清晰;substring()将负数转0且自动交换参数,易引发隐式bug;substr()为已弃用的非标准方法,应避免使用。

高效使用字符串方法的关键,不在于记住所有语法,而在于清楚每个方法的定位和边界行为——尤其是它们对负数、越界、顺序颠倒的处理逻辑不同,稍不注意就会得到意外结果。
split:按分隔符“切开”,返回数组
它不是截取子串,而是把字符串按规则“打散”。核心是分隔逻辑,不是位置索引。
- 不传参数时,按任意空白(空格、制表、换行)自动合并并忽略首尾空白,比如
" a b\tc\n".split() →["a", "b", "c"] - 传空字符串
""会把每个字符都拆开:"abc".split("")→["a","b","c"] - 传具体分隔符(如
"-")时,只认字面匹配,不转正则;想用正则得用re.split() -
limit参数控制最多切几刀,比如"a-b-c-d".split("-", 2)→["a","b","c-d"]
slice:通用、安全、支持负索引的“区间提取”
适用于字符串和数组,行为统一,推荐作为默认选择。
- 语法:
str.slice(start, end),左闭右开(包含 start,不包含 end) - start 或 end 为负数时,自动转为
length + 负值,比如"hello".slice(-3)→"llo" - start ≥ end 时返回空字符串,不会报错也不会交换参数
- 超出范围会静默截断,比如
"hi".slice(1, 100)→"i"
substring:只认非负数,“自动纠错”型提取
适合简单场景,但负数会被强制转 0,且参数大小会自动调换,容易掩盖逻辑错误。
- 语法:
str.substring(start, end),也是左闭右开 - 任何负参数都会变成 0,所以
"abc".substring(-1, 2)实际等价于substring(0, 2)→"ab" - 如果 start > end,内部会先交换再计算,
substring(3,1)等同于substring(1,3) - 没有负索引能力,想取末尾必须手动算长度:
str.substring(str.length - 3)
别用 substr:已废弃,语义易混淆
它用“起始位置 + 长度”方式,看似直观,但标准未定义、浏览器兼容性差,且和 slice/substring 混用极易出错。
- 例如:
"hello".substr(1, 3)→"ell"(从索引 1 开始取 3 个字符) - 负 start 行为各浏览器不一致,ECMAScript 明确反对使用
- 功能完全可用 slice 替代:
str.slice(1, 4)效果相同,更清晰、更可靠


















