js字符串截取的方法詳解(slice银伟、substring你虹、substr)

面試中: 請(qǐng)問(wèn)字符串的截取方法有哪些?各有什么特點(diǎn)彤避?
相信大家都熟悉字符串中的截取方法: slice傅物、 substring 、substr琉预,它們的身影總會(huì)出現(xiàn)在面試中董饰、工作中
那么總結(jié)一下吧~

咱們先來(lái)一段前戲:

字符串是一種基本數(shù)據(jù)類(lèi)型,為什么它身上會(huì)有這三種方法呢圆米?哈哈卒暂,一句老話,“萬(wàn)物皆對(duì)象”娄帖,其實(shí)字符串是一種包裝對(duì)象類(lèi)型也祠,每當(dāng)讀取一個(gè)基本數(shù)據(jù)類(lèi)型值的時(shí)候,或者引用了其方法或?qū)傩越伲琂avaScript就會(huì)將字符串值val通過(guò)調(diào)用new String(val)的方法轉(zhuǎn)換成對(duì)象诈嘿,那么這個(gè)對(duì)象繼承了字符串的方法堪旧,一旦方法使用結(jié)束之后,這個(gè)新創(chuàng)建的對(duì)象就會(huì)被銷(xiāo)毀(自生自滅~)

來(lái)個(gè)涼菜:

        var str = 'some string';
        // (1) 創(chuàng)建 String 類(lèi)型的一個(gè)實(shí)例永淌;
        // (2) 在實(shí)例上調(diào)用指定的方法崎场;
       
        // var str = new String('some string');
        // var newStr = str.slice(2);
         
        var newStr = str.slice(2);
        // (3) 銷(xiāo)毀這個(gè)實(shí)例
        // str = null;

開(kāi)始咱們的翻云覆雨吧~
嘿嘿~ 不過(guò)還是先來(lái)幾個(gè)咱們熟悉的姿勢(shì)~

1. String.slice

語(yǔ)法:
str.slice(start, end);
起始下標(biāo)(start) <= 截取的范圍 < 結(jié)束下標(biāo)(end)
包括起始下標(biāo)對(duì)應(yīng)字符, but不包括結(jié)束下標(biāo);

來(lái)個(gè)'串'

let str = '小貝老師真漂亮!';
  1. 當(dāng)只傳一個(gè)參數(shù)的時(shí)候:默認(rèn)為start,(start <= 范圍 < str.length)
console.log(str.slice(1)); // 貝老師真漂亮!
  1. 當(dāng)傳兩個(gè)參數(shù)的時(shí)候:截取的字符串為: start <= 截取范圍 < end
console.log(str.slice(1, 4)); // 貝老師

2. String.substring

語(yǔ)法:
str.substring(start, end);
起始下標(biāo) <= 截取的范圍 < 結(jié)束下標(biāo)
包括起始下標(biāo)對(duì)應(yīng)字符, 但不包括結(jié)束下標(biāo);

也來(lái)個(gè)'串'

let str = '小貝老師真漂亮!';
  1. 當(dāng)只傳一個(gè)參數(shù)的時(shí)候:默認(rèn)為start遂蛀,(start <= 范圍 < str.length)
console.log(str.substring(1)); // 貝老師真漂亮!
  1. 當(dāng)傳兩個(gè)參數(shù)的時(shí)候:截取的字符串為: start <= 截取范圍 < end
console.log(str.substring(1, 4)); // 貝老師

3. String.substr

語(yǔ)法:
str.substr(start, length);
起始下標(biāo)<= 截取的范圍 <= 自定義截取的長(zhǎng)度
substr方法更直截(直接定義長(zhǎng)度)

再來(lái)個(gè)'串'

let str = '小貝老師真漂亮!';
  1. 當(dāng)只傳一個(gè)參數(shù)的時(shí)候:默認(rèn)為start谭跨, (start<= 截取范圍 < str.length)
console.log(str.substr(1)); // 貝老師真漂亮!
  1. 當(dāng)傳兩個(gè)參數(shù)的時(shí)候:截取的字符串為: (start <= 截取范圍 <= 自定義截取的長(zhǎng)度)
console.log(str.substr(1, 4)); // 貝老師真

熟悉的姿勢(shì)咱們都用過(guò)了,試試不常用的姿勢(shì)了吧~
要進(jìn)入高潮啦~ 忍住啦~

一. String.slice() 遇上了'辣妹子'(負(fù)數(shù))該如何是否李滴?

1. 當(dāng)起始值start為負(fù)數(shù)的時(shí)候:

let str = '小貝老師真漂亮!';
console.log(str.slice(-1)); // !
console.log(str.slice(-2)); // 亮!
console.log(str.slice(-3)); // 漂亮!

結(jié)果為:
反向下標(biāo)截取
反向的下標(biāo)<= 截取范圍 < 字符串長(zhǎng)度

2. 當(dāng)反向下標(biāo)的絕對(duì)值大于或等于長(zhǎng)度的時(shí)候呢螃宙?

console.log(str.slice(-str.length)); // 小貝老師真漂亮!
console.log(str.slice(-str.length - 1)); // 小貝老師真漂亮!
console.log(str.slice(-str.length - 2)); // 小貝老師真漂亮!

當(dāng)反向下標(biāo)的絕對(duì)值大于或等于字符串長(zhǎng)度,仿佛會(huì)置為0所坯,結(jié)果截取到了字符串結(jié)束

來(lái)張紙巾(粗糙的畫(huà)畫(huà))擦擦汗吧~ 反向下標(biāo)是個(gè)啥谆扎?


反向下標(biāo).PNG
  1. 反向的下標(biāo)對(duì)應(yīng)的字符 ~ 截取至字符串結(jié)束
  2. 反向下標(biāo)的絕對(duì)值大于了字符串長(zhǎng)度會(huì)置為0,然后再開(kāi)始截取

3. '軟妹子'(正)和'辣妹子'(負(fù))一起上

3.1 起始下標(biāo)為正數(shù) <= 截取范圍 < 結(jié)束下標(biāo)為負(fù)數(shù)
// 負(fù)數(shù)的結(jié)束下標(biāo)未超越正數(shù)的起始下標(biāo)
console.log(str.slice(1, -2)); // 貝老師真漂
console.log(str.slice(2, -4)); // 老師
console.log(str.slice(2, -5)); // 老

// 相同位置 正負(fù)下標(biāo)對(duì)應(yīng)同一個(gè)字符
console.log(str.slice(2, -6)); // ''

// 負(fù)數(shù)的結(jié)束下標(biāo)超越正數(shù)的起始下標(biāo)
console.log(str.slice(2, -7)); // ''

會(huì)發(fā)現(xiàn)只要end在start右側(cè)才會(huì)正常的截取;
當(dāng)end與start重合或者在start的左側(cè)則變成了空字符串
說(shuō)明違反了 start <= 截取范圍 < end規(guī)則(截取的方向是從左至右的)芹助,返回的是空字符串

3.2 起始下標(biāo)為負(fù)數(shù)<= 截取范圍 < 結(jié)束下標(biāo)為正數(shù)

當(dāng)start為負(fù)數(shù)與0重合或在0的左側(cè)堂湖,則會(huì)置為0,而重合返回是空字符串状土,按照start <= 截取范圍 < end規(guī)則

// 負(fù)數(shù)的起始下標(biāo) -> 0的結(jié)束下標(biāo)
console.log(str.slice(-9, 0)); // ''

// 負(fù)數(shù)的起始下標(biāo) === 0的結(jié)束下標(biāo)
console.log(str.slice(-8, 0)); // ''

// 負(fù)數(shù)的起始下標(biāo) -> 正數(shù)的結(jié)束下標(biāo)
console.log(str.slice(-8, 2)); // '小貝'
console.log(str.slice(-8, 8)); // '小貝老師真漂亮!'

當(dāng)然還得測(cè)試一下end在start左側(cè)的時(shí)候

結(jié)果:返回的是空字符串无蜂,(可以看出截取的方向是從左往右: start -> end)

// 負(fù)數(shù)的起始下標(biāo) -> 正數(shù)的結(jié)束下標(biāo) (end在start左側(cè))
console.log(str.slice(-3, 2)); // ''

二. String.Substring() 遇上了'辣妹子'(負(fù)數(shù))又該如何是好?

1. 當(dāng)起始下標(biāo)為'辣妹子'(負(fù)數(shù))的時(shí)候

負(fù)數(shù)的起始值果斷置0~

substring-負(fù)數(shù).PNG
substring-負(fù)數(shù)結(jié)果.PNG

2.Substring遇上一正一負(fù)的時(shí)候

2.1 當(dāng)起始下標(biāo)為'辣妹子'(負(fù)數(shù))蒙谓,結(jié)束下標(biāo)為'軟妹子'(正數(shù))

哈哈斥季,果斷的man!負(fù)數(shù)都置為0了累驮,真好~

substring-2.PNG
substring-2-res.PNG

2.2當(dāng)起始下標(biāo)為'辣妹子'(負(fù)數(shù))酣倾,結(jié)束下標(biāo)也為'辣妹子'(負(fù)數(shù))的時(shí)候~

鋼鐵直男的果斷,負(fù)數(shù)的結(jié)束下標(biāo)也置0了谤专,導(dǎo)致都是空字符串

substring-3.PNG
substring-3-res.PNG

2.3難不成這個(gè)東東就這么硬氣嗎躁锡?遇上負(fù)數(shù)這個(gè)妹子就一點(diǎn)都不懂得變通嗎?

請(qǐng)看當(dāng)起始下標(biāo)為正數(shù)置侍,結(jié)束下標(biāo)為妹子(負(fù)數(shù))

substring-4.PNG
substring-4-res.PNG

哈哈映之,差點(diǎn)單身一輩子了吧~
Substring方法:
當(dāng)結(jié)束下標(biāo)為負(fù)數(shù)則置為0,然后與起始下標(biāo)互換位置;
起始下標(biāo)正數(shù)搖身一變成為了結(jié)束下標(biāo)截取的;
方向依然從左往右

三墅垮、給String.substr()一次機(jī)會(huì)-當(dāng)它遇上'辣妹子'(負(fù)數(shù))又是什么情況呢惕医?

1. 起始值可以為負(fù)數(shù)耕漱,but自定義截取的長(zhǎng)度請(qǐng)不要定義為負(fù)數(shù)

當(dāng)起始下標(biāo)為負(fù)數(shù)時(shí)算色,采取反向下標(biāo)對(duì)應(yīng)
當(dāng)截取的長(zhǎng)度設(shè)置為0或者是負(fù)數(shù)的時(shí)候則返回空字符串

subStr.PNG
subStr-res.PNG

爽過(guò)之后,溫存一下~

回頭看看用過(guò)的紙巾~
先記住這個(gè)反向下標(biāo)螟够,然后總結(jié)下面幾點(diǎn)灾梦,咱們就不會(huì)混淆啦~


反向下標(biāo).PNG

1峡钓、 Slice

a) 注意截取順序: 從左至右
b) 結(jié)束下標(biāo)出現(xiàn)在起始下標(biāo)左側(cè)則返回空字符串

2、 Substring

a) 負(fù)數(shù)下標(biāo)會(huì)置零若河,
b) start為正數(shù)能岩,end為負(fù)數(shù),end置零后會(huì)與start互換位置

3萧福、 substr

a) 長(zhǎng)度不能為負(fù)數(shù)
b) Start可為負(fù)數(shù)拉鹃,可參考slice方法start為負(fù)數(shù)

首先很感謝能看到這里,也希望對(duì)大家有所幫助鲫忍,如果問(wèn)題膏燕,請(qǐng)多多賜教~

貝程教育-國(guó)內(nèi)資深的前端,全棧工程師培訓(xùn)基地

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末悟民,一起剝皮案震驚了整個(gè)濱河市坝辫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌射亏,老刑警劉巖近忙,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異智润,居然都是意外死亡及舍,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)做鹰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)击纬,“玉大人,你說(shuō)我怎么就攤上這事钾麸「瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵饭尝,是天一觀的道長(zhǎng)肯腕。 經(jīng)常有香客問(wèn)我,道長(zhǎng)钥平,這世上最難降的妖魔是什么实撒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮涉瘾,結(jié)果婚禮上知态,老公的妹妹穿的比我還像新娘。我一直安慰自己立叛,他們只是感情好负敏,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著秘蛇,像睡著了一般其做。 火紅的嫁衣襯著肌膚如雪顶考。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天妖泄,我揣著相機(jī)與錄音驹沿,去河邊找鬼。 笑死蹈胡,一個(gè)胖子當(dāng)著我的面吹牛渊季,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播罚渐,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼梭域,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了搅轿?” 一聲冷哼從身側(cè)響起病涨,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎璧坟,沒(méi)想到半個(gè)月后既穆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雀鹃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年幻工,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片黎茎。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡囊颅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出傅瞻,到底是詐尸還是另有隱情踢代,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布嗅骄,位于F島的核電站胳挎,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏溺森。R本人自食惡果不足惜慕爬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屏积。 院中可真熱鬧医窿,春花似錦、人聲如沸炊林。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)铛铁。三九已至隔显,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間饵逐,已是汗流浹背括眠。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倍权,地道東北人掷豺。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像薄声,于是被迫代替她去往敵國(guó)和親当船。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容