substring和substr有什么区别

substring()substr() 都是用于截取字符串的方法,但它们在参数含义和行为上有重要区别。substr() 现已废弃,不建议在新项目中使用。

主要区别对比表

特性 substring(start, end) substr(start, length)
参数含义 start: 起始索引 end: 结束索引 start: 起始索引 length: 要截取的字符数
结束参数 第二个参数是结束索引(不包含) 第二个参数是要截取的长度
负数参数 将负数转换为 0 负数 start: 从字符串末尾倒数 负数 length: 返回空字符串
参数顺序 如果 start > end,会自动交换参数 不会交换参数
ECMAScript 状态 推荐使用 已废弃 (不推荐使用)
替代方案 本身可用 使用 slice()substring()

详细说明

substring(startIndex, endIndex)

  • 参数
    • startIndex:必需,起始位置(包含)
    • endIndex:可选,结束位置(不包含)
  • 特点
    • 如果省略 endIndex,则截取到字符串末尾
    • 如果任一参数为负数,会被当作 0 处理
    • 如果 startIndex > endIndex,会自动交换两个参数
    • 如果参数是 NaN,会被当作 0
js 复制代码
const str = "Hello World";

console.log(str.substring(6));      // "World"
console.log(str.substring(6, 11));  // "World"
console.log(str.substring(6, 7));   // "W"
console.log(str.substring(3, 0));   // "Hel" (参数自动交换)
console.log(str.substring(-3));     // "Hello World" (负数变0)

substr(startIndex, length) ❌(已废弃)

  • 参数
    • startIndex:必需,起始位置
    • length:可选,要截取的字符数
  • 特点
    • startIndex 可以是负数,表示从字符串末尾倒数
    • 如果 length 为 0 或负数,返回空字符串
    • 如果省略 length,则截取到字符串末尾
js 复制代码
const str = "Hello World";

console.log(str.substr(6));       // "World"
console.log(str.substr(6, 5));    // "World"
console.log(str.substr(6, 1));    // "W"
console.log(str.substr(-3));      // "rld" (从倒数第3个开始)
console.log(str.substr(-5, 2));   // "Wo"

现代替代方案:slice()

由于 substr() 已废弃,推荐使用 slice() 作为替代

js 复制代码
const str = "Hello World";

// 基本用法
console.log(str.slice(6));       // "World"
console.log(str.slice(6, 11));   // "World"

// 支持负数索引
console.log(str.slice(-5));      // "World" (最后5个字符)
console.log(str.slice(0, -6));   // "Hello" (从开头到倒数第6个)

// 负数参数表示从末尾开始计数
console.log(str.slice(6, -1));   // "Worl" (从索引6到倒数第1个)

三种方法对比

js 复制代码
const str = "JavaScript";

// 正数参数
console.log(str.substring(4, 7));  // "Scr" (索引4到7)
console.log(str.substr(4, 3));     // "Scr" (从索引4开始,取3个字符)
console.log(str.slice(4, 7));      // "Scr" (索引4到7)

// 负数参数
console.log(str.substring(-3));     // "JavaScript" (负数变0)
console.log(str.substr(-3));        // "ipt" (最后3个字符)
console.log(str.slice(-3));         // "ipt" (最后3个字符)

// 参数交换
console.log(str.substring(7, 4));   // "Scr" (自动交换为4,7)
console.log(str.substr(7, 4));      // "ipt" (从索引7取4个,实际只有3个)
console.log(str.slice(7, 4));       // "" (start>end,返回空)

最佳实践建议

  1. 不再使用 substr() ,因为它是已废弃的旧方法
  2. 根据需求选择
    • 使用 substring():当需要明确的开始和结束索引时
    • 使用 slice():当需要负数索引功能时,或作为 substr() 的替代
  3. 记忆技巧
    • substring:第二个参数是"到哪里结束"
    • substr:第二个参数是"要截取多长"(已废弃)
    • slice:类似于数组的 slice 方法,支持负数索引

简单来说:请使用 slice()substring(),避免使用 substr()

相关推荐
AI前端老薛7 分钟前
CSS实现动画的几种方式
前端·css
晨米酱9 分钟前
轻量级 Git Hooks 管理工具 Husky
前端·代码规范
携欢11 分钟前
portswigger靶场之修改序列化数据类型通关秘籍
android·前端·网络·安全
GuMoYu12 分钟前
npm link 测试本地依赖完整指南
前端·npm
代码老祖13 分钟前
vue3 vue-pdf-embed实现pdf自定义分页+关键词高亮
前端·javascript
未等与你踏清风13 分钟前
Elpis npm 包抽离总结
前端·javascript
代码猎人13 分钟前
如何使用for...of遍历对象
前端
秋天的一阵风15 分钟前
🎥解决前端 “复现难”:rrweb 录制回放从入门到精通(下)
前端·开源·全栈
林恒smileZAZ15 分钟前
【Vue3】我用 Vue 封装了个 ECharts Hooks
前端·vue.js·echarts
颜酱16 分钟前
用填充表格法-继续吃透完全背包及其变形
前端·后端·算法