js里相似的方法比较系列(一)String的slice,substring,substr方法区别

大家好,我是李俊辉!如果您觉得文章有用,请帮忙点个赞或关注,也为我鼓励一下,坚持写下去!

javascript有很多方法名称相似、功能相似,搞的很多新同学云里雾里,一直处于似懂非懂,不懂又懂的状态(至少我刚学前端前2年是这样的^^||)。主要原因就是懒得花时间整理这些东西,感觉知道是干嘛的就行了。但是当开发碰到问题的时候(特别是字符串或者数组算法问题),往往想不起来到底应该用哪个方法才是更好的选择。始终在心里是个技术结。当你真正踏实下来打算提高自己的时候,这些方法的区别都是你不得不吃透的一块内容。
为此,我准备了八个系列(暂定8个,将来想起来再补充)专门讲解这些让人郁闷的类似功能。

今天先来说说字符串String的三个相似方法:slice,substr,substring的区别。如果你闭上眼睛能很清楚的想明白这三个方法的区别,那本篇文章就不用看了。
我们进入正题,这三个方法都是用来截取字符串,都是基于原字符串创建新字符串的方法。

1.slice()

slice方法是字符串String和数组Array共同都有的一个同名方法。今天我们主要说String,后面的文章会讲解到Array的slice。

slice(start, end)字符串中第一个字符位置索引为 0,最后一位索引为string.length。
截取位置为start到end的前一位字母,比如end是7,那实际截取字母是6。
end可以省略,省略则为字符串最后位置string.length。
start和end参数都可以是负数,如果是负数,从字符串的尾部往前算位置,-1 指字符串的最后一个字符,-2 指倒数第二个字符,以此类推。
看到下面的代码输出,应该就对slice一目了然了。

var str = 'hello world';
console.log(str.slice(3)); //相当于console.log(str.slice(3, str.length));
//输出: 'lo world'
console.log(str.slice(3, 9));
//输出: 'lo wor'
console.log(str.slice(9,3))  //当end索引小于start索引时,无法截取,输出空字符串。
//输出:'' 
console.log(str.slice(3,-9))  //再一次证明当end索引小于start索引时,无法截取,输出空字符串。
//输出:'' 
console.log(str.slice(-3,9))  //end比start索引正好大1为
//输出:'r' 
console.log(str.slice(3, -1));  //相当于console.log(str.slice(3,10)) 
//输出:'lo worl',少最后一个d,因为索引位在d前面。
console.log(str.slice(-3, -9));  //end索引小于start,返回空。
//输出:''

2.substring()

substring与slice方法的参数一样,都是start和end索引。唯一的区别是start和end为负数时,默认会把负数转变为0。 所以substring与slice的区别就是两个参数为负数的时截取结果不同。
看到下面的代码输出,应该就对substring一目了然了。

var str = 'hello world';
console.log(str.substring(3)); //相当于console.log(str.substring(3, str.length));
//输出: 'lo world'
console.log(str.substring(3, 9));
//输出: 'lo wor'
console.log(str.substring(9, 3));  //相当于console.log(str.substring(3, 9));
//输出:'lo wor'  //如果end大于start,则end与start互换位置后返回。
console.log(str.substring(-3, 9));  //如果start为负数,end为正数,则返回从0到end位字符串。
//输出:'hello wor'
console.log(str.substring(3, -1));  //如果end为负数,则互换位置,返回从0到start位字符串。
//输出:'hel'
console.log(str.substring(-3, -9));  //如果start为负数,end也为负数,同为0则返回空。
//输出:''

2.substr()

substr也是接受2个参数start和end索引。不过end代表的是要截取的字符长度。
start参数和slice的start功能一样,但end不能为负数,因为长度不可以为负数,end负值会转化为零。
看到下面的代码输出,应该就对substr一目了然了。

var str = 'hello world';
console.log(str.substr(3)); 
//输出: 'lo world'
console.log(str.substr(3, 5)); //从3开始截取5个字符
//输出: 'lo wo'
console.log(str.substr(5, 3));  //从5开始截取3个字符
//输出:'wo'
console.log(str.substr(-3, 5));  //如果start为负数,则索引为倒数负数值开始截取。
//输出:'rld'
console.log(str.substr(3, -1));  //不接受end为负数,返回空
//输出:''
console.log(str.substr(-3, -5));  //不接受end为负数,返回空
//输出:''

总结:

最后,我们整体看一下他们的共同点和区别,有一个更清楚的分辨。
1.共同点
只传1个参数时,start时,三个方法一样,用哪个都可以。

var str = 'hello world';
console.log(str.slice(3), str.substr(3), str.substring(3));
//输出:'lo world', 'lo world', 'lo world'

2.不同点

  1. 传入第2个参数,end时,正数时:
console.log(str.slice(3,5), str.substr(3,5), str.substring(3,5)); 
//输出:'lo', 'lo wo', 'lo'
  1. 当传入的start, end是负数时:
    slice() startend均可以是负数,会把当前的负值加上字符串的长度。如slice(-3),相当于slice(8)。
    substring()会把所有的负值转化为零。
    substr() start负值会把当前的负值加上字符串的长度,end负值会转化为零(因为end代表长度,截取的字符长度不能为负)。

今天就到这吧,下一节我们讲解js里相似的方法比较系列(二)slice,splice,split方法区别,已发布~!

如果您觉得文章有用,请帮忙点个赞或关注,也为我鼓励一下,坚持写下去,在此感谢🙏!

转载一定注明出处!
原文地址:https://www.jianshu.com/p/7d25d99a83da
2020年2月11日 新冠状病毒期间憋在家

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342