徹底搞懂字串提取方法 slice,substr,substring
阿新 • • 發佈:2021-08-25
ECMAScript提供了3個從字串中提取子字串的方法:slice(),substr(),substring();為什麼要出三個方法呢,下面就來分析這三個方法的共同點與區別。
對於兩個引數都是正整數的情況下:
相同點:
- 這三個方法都返回呼叫他們的字串的一個子字串,也就是不會改變原字串
- 都接收一到兩個引數,第一個引數表示子字串開始的位置,第二個引數表示子字串結束的位置
- 省略第二個引數都表示提取到末尾
不同點:
- 對 slice()和 substring()而言,第二個引數是提取結 束的位置(即該位置之前的字元會被提取出來)。對 substr()而言,第二個引數表示返回的子字串數量
let str = 'hello word'; console.log(str.slice(3)); // "lo word" console.log(str.substr(3)); // "lo word" console.log(str.substring(3)); // "lo word" console.log(str.slice(3, 7)); // "lo w" console.log(str.substring(3, 7)); // "lo w" console.log(str.substr(3, 7)); // "lo worl"
在這個例子中,slice()、substr()和 substring()是以相同方式被呼叫的,而且多數情況下返 回的值也相同。如果只傳一個引數 3,則所有方法都將返回"lo world",因為"hello"中"l"位置為 3。 如果傳入兩個引數 3 和 7,則 slice()和 substring()返回"lo w"(因為"world"中"o"在位置 7, 不包含),而 substr()返回"lo worl",因為第二個引數對它而言表示返回的字元數。
當某個引數是負值的情況下:
- slice()方法將所有負值引數都當成字 符串長度加上負引數值。
- substr()方法將第一個負引數值當成字串長度加上該值,將第二個負引數值轉換為 0
- substring()方法會將所有負引數值都轉換為 0
let stringValue = "hello world"; console.log(stringValue.slice(-3)); // "rld" console.log(stringValue.substring(-3)); // "hello world" console.log(stringValue.substr(-3)); // "rld" console.log(stringValue.slice(3, -4)); // "lo w" console.log(stringValue.substring(3, -4)); // "hel" console.log(stringValue.substr(3, -4)); // "" (empty string)
這個例子明確演示了 3 個方法的差異。在給 slice()和 substr()傳入負引數時,它們的返回結果 相同。這是因為-3 會被轉換為 8(長度加上負引數),實際上呼叫的是 slice(8)和 substr(8)。而 substring()方法返回整個字串,因為-3 會轉換為 0。
在第二個引數是負值時,這 3 個方法各不相同。slice()方法將第二個引數轉換為 7,實際上相當 於呼叫 slice(3, 7),因此返回"lo w"。而 substring()方法會將第二個引數轉換為 0,相當於呼叫 substring(3, 0),等價於 substring(0, 3),這是因為這個方法會將較小的引數作為起點,將較 大的引數作為終點。對 substr()來說,第二個引數會被轉換為 0,意味著返回的字串包含零個字元, 因而會返回一個空字串。