substr,substring,slice 的区别

本文详细解析了JavaScript中用于截取字符串的三种方法:substr、substring及slice的区别与使用技巧。通过实例说明了这些函数如何处理不同的参数,尤其是在负数参数情况下的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    javascript中的三个函数substr,substring,slice都可以用来提取字符串的某一部分(函数名称都是小写,不要写成subStr,subString又或者Substring,记住js是区分大小写的),但是它们之间还是有一些区别的。

substring(start,end)和slice(start,end)都表示提取从start下标开始(包括该下标上的字符)到end下标结束(不包括该下标上的字符)之间的内容,如果不包含end参数则表示提取从start到结尾的全部字符

 

例1:

"9876543210".substring(0,2)-->"98"    

"9876543210".slice(0,2)-->"98"

"9876543210".substring(5)-->"43210"

"9876543210".slice(5)-->"43210"

 

但是他们之间还是有区别的,

substring不支持负数参数(如果为负数则转换为0来处理),slice支持负数参数(如果参数为负数则表示从最右边算起,例1第一行中的0为-1,1为-2);substring如果end>start则互相交换,而slice则不支持交换

 

例2:

"9876543210".slice(-5,-2)-->"432" 
"9876543210".substring(-5,-2)-->""

上面的slice中的-5从尾部0开始数刚好为4,-2则为1,因为不会包含end的字符所以提取了"432"

而substring则将-5,-2都转换为0来出来所以实际为"9876543210".substring(0,0)所以得到""的空字符串。

 

例3:

"9876543210".slice(5,1)-->""

"9876543210".substring(5,1)-->"8765"

上面的slice开始小标大于结束小标, 因为不支持交换所以只能得到""

substring则被解释为"9876543210".substring(1,5)所以得到了"8765"

 

下面来解释一下substr函数,为什么要将substr放到最后呢,因为substr其实是不是作为ECMAScript标准发布的,因此各种浏览器之间不是兼容的,但是既然提出来了还是讲一下

 

substr(start,length)函数可以看出其实和上面两种函数的差别,即第二个参数代表的是截取的长度,不再是作为结尾下标来处理,所以该函数表示从开始下标start开始,向右截取length个长度的字符。按照w3c上来讲start是支持负数的,即表示从字符传的结尾开始计算,但是因为该函数并不是标准里的所以各浏览器实现不一,所以还是不建议用负数了。length为负数则不会截取任何字符,因为长度不可能为负的

 

例4:

"9876543210".substr(2,3)-->"765"

"9876543210".substr(2,-1)-->""

第一个从开始下标为2的7开始,截取三个字符得到"765"

第二个因为长度为-1所以不做任何截取操作

 

例5:

"9876543210".substr(-5,2)-->"43"(FireFox)

"9876543210".substr(-5,2)-->"98"(IE)

 

看上面两个实现,FireFox中开始下标-5按照从尾部开始计算取倒数第5个数即4开始截取两个字符得到"43"

而IE下将-5转换为0因此从左开始计算得到0下标的9,再获取两个长度得到"98"

可以明显的看到因为不标准的缘故,实现方式产生了不一致。

转载于:https://www.cnblogs.com/jiqing9006/p/4969237.html

### JavaScript 中 `substr` 和 `slice` 函数的区别 #### 定义与功能 `slice()` 方法提取字符串的一部分并返回新的字符串,而不会修改原字符串。此方法的工作方式类似于 `substring()`,但具有一些不同之处[^1]。 对于 `substr()` 方法而言,其主要依据起始位置和长度来截取字符串片段。这不同于 `slice()` 的操作逻辑,后者依赖于起始索引和结束索引之间的字符范围[^2]。 #### 参数说明 - **`slice(start, end)`** - `start`: 提取部分的开始索引。 - `end`(可选): 结束前的一个索引;如果省略,则会一直复制到结尾。 - **`substr(startIndex, length)`** - `startIndex`: 开始抽取的位置。 - `length`(可选): 要抽取的数量;如果不提供,默认直到字符串末尾。 #### 行为差异 当处理负数作为参数时,两者表现也有所不同: - 对于 `slice()` 来说,传递给它的负数值会被视为相对于字符串末端的距离计算起点。 - 反之,在 `substr()` 中遇到的第一个负数参数将被当作零处理,并且第二个参数即使为负也会按照绝对值解释为其应获取的字符数量。 下面通过具体例子展示两者的区别: ```javascript let str = "hello world"; console.log(str.slice(3)); // 输出:"lo world" console.log(str.substr(3)); // 输出:"lo world" console.log(str.slice(-5)); // 输出:"world" console.log(str.substr(-5)); // 输出:"world" // 当使用两个参数时: console.log(str.slice(0, 5)); // 输出:"hello" console.log(str.substr(0, 5)); // 输出:"hello" console.log(str.slice(6, -1)); // 输出:"worl" console.log(str.substr(6, -1)); // 同样效果同上,因为负数在这里无意义 ``` 值得注意的是,尽管上述大部分情况下两种方法看起来相似,但在实际应用中应当注意它们各自的特点以及可能带来的细微差别。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值