點燈坊

失くすものさえない今が強くなるチャンスよ

slice() 與 substring() 比較

Sam Xiao's Avatar 2020-01-30

substring()slice() 都可回傳部分 string,若 End Index 使用 負數,則兩者有重大差異。

Version

macOS Catalina 10.15.2
VS Code 1.40.2
Quokka 1.0.259
Ramda 0.26.1

Greater End Index

let data = 'FP in JavaScript'

data.slice(6, 16) // ?
data.substring(6, 16) // ?

正常狀況下,end index 會比 start index 大,此時 slice() 等效於 substring()

slice000

Greater Start Index

let data = 'FP in JavaScript'

data.slice(16, 6) // ?
data.substring(16, 6) // ?
data.substring(6, 16) // ?

若 start index 比 end index 大時,slice() 會正常回傳 empty string,但 substring() 會自動 swap argument 回傳部分 string。

slice001

Negative Index

let data = 'FP in JavaScript'

data.slice(6, -2) // ?
data.substring(6, -2) // ?
data.substring(6, 0) // ?
data.substring(0, 6) // ?

若 index 出現 負數slice() 會正常運作,但 substring() 會將 負數 自動轉成 0,若 start index 還大於 end index,還會繼續 swap argument,因此結果不可預期。

slice002

Conclusion

  • 實務上建議使用 slice() 取代 substring(),較不會有意想不到結果,尤其 index 為 負數 時,一定得使用 slice()

Reference

MDM, String.prototype.substring()