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

面試中: 請問字符串的截取方法有哪些?各有什么特點?
相信大家都熟悉字符串中的截取方法: slice、 substring 、substr,它們的身影總會出現在面試中、工作中
那么總結一下吧~

咱們先來一段前戲:

字符串是一種基本數據類型,為什么它身上會有這三種方法呢?哈哈,一句老話,“萬物皆對象”,其實字符串是一種包裝對象類型,每當讀取一個基本數據類型值的時候,或者引用了其方法或屬性,JavaScript就會將字符串值val通過調用new String(val)的方法轉換成對象,那么這個對象繼承了字符串的方法,一旦方法使用結束之后,這個新創建的對象就會被銷毀(自生自滅~)

來個涼菜:

        var str = 'some string';
        // (1) 創建 String 類型的一個實例;
        // (2) 在實例上調用指定的方法;
       
        // var str = new String('some string');
        // var newStr = str.slice(2);
         
        var newStr = str.slice(2);
        // (3) 銷毀這個實例
        // str = null;

開始咱們的翻云覆雨吧~
嘿嘿~ 不過還是先來幾個咱們熟悉的姿勢~

1. String.slice

語法:
str.slice(start, end);
起始下標(start) <= 截取的范圍 < 結束下標(end)
包括起始下標對應字符, but不包括結束下標;

來個'串'

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

2. String.substring

語法:
str.substring(start, end);
起始下標 <= 截取的范圍 < 結束下標
包括起始下標對應字符, 但不包括結束下標;

也來個'串'

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

3. String.substr

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

再來個'串'

let str = '小貝老師真漂亮!';
  1. 當只傳一個參數的時候:默認為start, (start<= 截取范圍 < str.length)
console.log(str.substr(1)); // 貝老師真漂亮!
  1. 當傳兩個參數的時候:截取的字符串為: (start <= 截取范圍 <= 自定義截取的長度)
console.log(str.substr(1, 4)); // 貝老師真

熟悉的姿勢咱們都用過了,試試不常用的姿勢了吧~
要進入高潮啦~ 忍住啦~

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

1. 當起始值start為負數的時候:

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

結果為:
反向下標截取
反向的下標<= 截取范圍 < 字符串長度

2. 當反向下標的絕對值大于或等于長度的時候呢?

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

當反向下標的絕對值大于或等于字符串長度,仿佛會置為0,結果截取到了字符串結束

來張紙巾(粗糙的畫畫)擦擦汗吧~ 反向下標是個啥?


反向下標.PNG
  1. 反向的下標對應的字符 ~ 截取至字符串結束
  2. 反向下標的絕對值大于了字符串長度會置為0,然后再開始截取

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

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

// 相同位置 正負下標對應同一個字符
console.log(str.slice(2, -6)); // ''

// 負數的結束下標超越正數的起始下標
console.log(str.slice(2, -7)); // ''

會發現只要end在start右側才會正常的截取;
當end與start重合或者在start的左側則變成了空字符串
說明違反了 start <= 截取范圍 < end規則(截取的方向是從左至右的),返回的是空字符串

3.2 起始下標為負數<= 截取范圍 < 結束下標為正數

當start為負數與0重合或在0的左側,則會置為0,而重合返回是空字符串,按照start <= 截取范圍 < end規則

// 負數的起始下標 -> 0的結束下標
console.log(str.slice(-9, 0)); // ''

// 負數的起始下標 === 0的結束下標
console.log(str.slice(-8, 0)); // ''

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

當然還得測試一下end在start左側的時候

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

// 負數的起始下標 -> 正數的結束下標 (end在start左側)
console.log(str.slice(-3, 2)); // ''

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

1. 當起始下標為'辣妹子'(負數)的時候

負數的起始值果斷置0~

substring-負數.PNG
substring-負數結果.PNG

2.Substring遇上一正一負的時候

2.1 當起始下標為'辣妹子'(負數),結束下標為'軟妹子'(正數)

哈哈,果斷的man!負數都置為0了,真好~

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

2.2當起始下標為'辣妹子'(負數),結束下標也為'辣妹子'(負數)的時候~

鋼鐵直男的果斷,負數的結束下標也置0了,導致都是空字符串

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

2.3難不成這個東東就這么硬氣嗎?遇上負數這個妹子就一點都不懂得變通嗎?

請看當起始下標為正數,結束下標為妹子(負數)

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

哈哈,差點單身一輩子了吧~
Substring方法:
當結束下標為負數則置為0,然后與起始下標互換位置;
起始下標正數搖身一變成為了結束下標截取的;
方向依然從左往右

三、給String.substr()一次機會-當它遇上'辣妹子'(負數)又是什么情況呢?

1. 起始值可以為負數,but自定義截取的長度請不要定義為負數

當起始下標為負數時,采取反向下標對應
當截取的長度設置為0或者是負數的時候則返回空字符串

subStr.PNG
subStr-res.PNG

爽過之后,溫存一下~

回頭看看用過的紙巾~
先記住這個反向下標,然后總結下面幾點,咱們就不會混淆啦~


反向下標.PNG

1、 Slice

a) 注意截取順序: 從左至右
b) 結束下標出現在起始下標左側則返回空字符串

2、 Substring

a) 負數下標會置零,
b) start為正數,end為負數,end置零后會與start互換位置

3、 substr

a) 長度不能為負數
b) Start可為負數,可參考slice方法start為負數

首先很感謝能看到這里,也希望對大家有所幫助,如果問題,請多多賜教~

貝程教育-國內資深的前端,全棧工程師培訓基地

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,030評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,310評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,951評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,796評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,566評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,055評論 1 322
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,142評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,303評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,799評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,683評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,899評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,409評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,135評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,520評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,757評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,528評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,844評論 2 372

推薦閱讀更多精彩內容