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()

相关推荐
子兮曰1 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰1 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万1 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝1 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95271 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大1 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师1 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端