slice和substr虽都能截取字符串,但参数逻辑完全不同:slice(start,end)中end为结束索引(不包含),substr(start,length)中length为字符数;substr已被标准标记为不推荐,现代代码应优先使用slice。

直接说结论:slice 和 substr 都能截取字符串,但参数逻辑完全不同,且 substr 已被明确标记为不推荐使用——现代代码应优先用 slice。
参数含义本质不同
这是最核心的差异,直接影响写法和结果:
-
slice(start, end):两个都是索引位置,end 不包含;例如
"hello".slice(1, 4)→"ell" -
substr(start, length):第二个参数是要取多少个字符,不是结束位置;例如
"hello".substr(1, 4)→"ello"
负数处理方式不兼容
传负数时,两者转换规则完全不一样,容易出错:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
slice(-2):从末尾倒数第 2 位开始,到结尾 →
"hello".slice(-2)→"lo" -
substr(-2, 2):start 负数按
str.length + (-2)计算(即倒数第 2 位),length 正常取 2 → 结果也是"lo" -
substr(-2, -1):length 为负直接视为 0 → 返回空字符串
""
边界行为差异明显
当起始位置超出范围或参数顺序异常时,反应不同:
-
slice(10, 5):start > end → 直接返回
"" -
substr(10, 3):start 超出长度 → 返回
"";但不会因 start > length 就报错或自动调整 - 两者都不修改原字符串,都返回新字符串
标准性与维护状态
这不是风格偏好,而是工程可靠性问题:
- slice:ECMAScript 标准方法,支持负索引,逻辑统一,所有环境稳定可用
- substr:非标准方法,ES6 起已被标记为“不推荐”,MDN 和主流指南均建议停用;未来引擎可能移除支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










