在程序語言中,字符串可以說是最常用的一種類型,而在程序中對字符串的操作也是十分頻繁。當程序語言自帶多種字符串操作的方法時,用該語言編程程序時就有很多的便利性,提高開發的效率。但是當方法過多,甚至目的相似、參數雷同的時候,就容易造成迷惑難以選擇的窘境。
在JavaScript中就有這樣的情況出現,對於取字符串的子串的操作,JavaScript提供了三種不同的方法:slice,substr,substring。雖然在網上隨便搜索一下,就可以找到介紹三者區別的文章,但是每次使用的時候,依然會迷糊無從選擇。因此結合網上介紹的區別,在本文中將它們的異同之處羅列在表中,方便參照和區分。
測試字符串: "0123456789"
瀏覽器:Chrome Version 29.0.1547.76
操作系統:Mac OS X Version 10.8.5
參數 | 方法 | ||||
參數1 | 參數2 | slice(begin[, end]) | substr(start[, length]) | substring(from[, to]) | |
參數/結果 | 7 | 789 | 789 | 789 | |
說明 | 只有參數1,省略參數2 | 從參數1指定的坐標截取到字符串結尾 | |||
參數/結果 | -3 | 789 | 789 | 0123456789 | |
說明 | 參數1為負數 | 從字符串末尾開始計算位置* | 視為0 | ||
參數/結果 | 21 | ||||
說明 | 參數1大於或等於字符串長度 | 視為字符串長度,即返回空字符串 | |||
參數/結果 | “3.21″ | 3456789 | 3456789 | 3456789 | |
說明 | 參數1為浮點數或只含數字的字符串 | 類似parseInt()將數值轉換成整形 | |||
參數/結果 | NaN | 0123456789 | 0123456789 | 0123456789 | |
說明 | 參數1非為有效數值 | 非有效數值視為視為0 | |||
參數/結果 | 3 | 7 | 3456 | 3456789 | 3456 |
說明 | 既有參數1,又有參數2 | 從參數1的位置截取到參數2的位置 | 從參數1的位置截取長度為參數2的字符 | 同slice() | |
參數/結果 | 7 | 3 | 789 | 3456 | |
說明 | 參數1大於參數2 | 返回空字符串 | 從參數1的位置截取長度為參數2的字符 | 交換參數1和參數2再進行截取 | |
參數/結果 | 3 | -3 | 3456 | 012 | |
說明 | 參數2為負數 | 負數從字符末尾開始計算位置 | 視為長度0,返回空字符串 | 交換參數,負數視為0 | |
參數/結果 | 3 | 21 | 3456789 | 3456789 | 3456789 |
說明 | 參數2大於或等於字符串長度 | 視為字符串長度,結果同省略參數2 | |||
參數/結果 | 3 | NaN | 012 | ||
說明 | 參數2非為有效數值 | 非有效數值視為0,返回空字符串 | 非有效數值視為0,因長度為0返回空字符串 | 非有效數值視為0,交換參數進行截取 | |
參數/結果 | -7 | -3 | 3456 | ||
說明 | 參數1和參數2都為負數 | 從字符串末尾開始計算位置 | 長度為負數,返回空字符串 | 負數視為0,返回空字符串 | |
參數/結果 | -7 | 7 | 3456 | 3456789 | 0123456 |
說明 | 參數1為正數,參數2為負數 | (自動套用上邊的規則,不解釋) |
*從字符串末尾開始計算位置:-1 指字符串中最后一個字符,-2 指倒數第二個字符,以此類推;也可視為字符串長度與負數之和的位置,若結果小於0,則視為0。
從上述表格對比中不難看出,三個方法之間的主要區別如下:
- 三個方法的參數1都代表子串開始位置,參數2在slice和substring中表示結束位置,而在substr中代表的則是子串長度;
- 對於負數態度,當出現在參數1的位置時,slice和substr從末尾開始計算,而substring不支持末尾計數法直接視為0;當出現在參數2位置時,slice和substring的處理同參數1:前者從末尾開始計算,后者轉換成0,而substr則視負數長度為0返回空串;
- 對於參數1小於參數2的情況,substring最大的不同在於它會交換兩個參數再截取子串,substr因第二參數表示的是長度因此並無異常,slice曽依然正常搜尋子串始末位置,若開始位置在結尾后邊則返回空串。
根據MDN對substr的描述,在IE下可能並不支持負數從末尾計算的方式。