在日常項目需求中,常常會遇到需要截取字符串操作的工作,而ECMAScript為我們提供了原生的截取字符串的函數,而且提供了三個:slice, substring, substr。我們怎么判斷在什么時候使用哪個字符串截取函數呢?
其實,只要搞清楚這三者的區別,就比較容易能夠判斷什么情況下,使用哪個字符串截取的函數了。
三者都是接受兩個可選參數。
最簡單的情況下,沒有傳入任何參數,則這三者沒有任何區別,類似於=操作符,直接復制了一個字符串出來。
如果之傳入一個參數,則直接取從參數開始到字符串結尾的字符串。遇到非正整數的參數,與兩個參數的處理情況相同。
str.slice(start, end)
slice的參數start和end可接受任意非NaN數值的參數,取start到end之間的字符,不包含end。如果參數為負,則會自動加上str.length進行糾正,如果依然為負值,則修正為0。如果end值小於start則返回空字符串。
console.log("abcdefghij".slice(3,1)) // '' console.log("abcdefghij".slice(-3,-1)) // 'hi' console.log("abcdefghij".slice(1, 3)) // 'bc' console.log("abcdefghij".slice(-20, -8)) // 'ab'
記住一個原則:如果end小於start,則返回空字符串。如果值為負數,加str.length糾正,依然為負,則調整為0。
str.substring(start, end)
也是接受任意數值的參數,如果參數為0或者NaN的話,會自動修正為0;如果end小於start的話,兩者位置顛倒。取start到end之間的字符,不包含end。
console.log("abcdefghij".substring(3,1)) // 'bc' console.log("abcdefghij".substring(-3,-1)) // '' console.log("abcdefghij".substring(1, 3)) // 'bc' console.log("abcdefghij".substring(-20, -8)) // ''
也有一個原則:就是兩個參數當中較小的會自動調整當做start參數,任何非正整數,都會當做0處理。
str.substr(start, length)
從形參名稱應該可以看出一點不同。substr第一個參數也是起始位置,但是第二個參數不是結束位置,而是需要截取多少個字符串。
start如果為負數,則與slice傳入負數參數一樣處理,讓其自身加str.length進行糾正,如果還小於0,則當做0處理。
length如果為0或者負數,則直接返回一個空字符串。
console.log("abcdefghij".substr(-13)) // 'abcdefghij' console.log("abcdefghij".substr(-13, 1)) // 'a' console.log("abcdefghij".substr(0, -1)) // '' console.log("abcdefghij".substr(-1, 3)) // 'j'
如此來看,就能夠比較清楚的分辨出來三者之間的用法和區別了。