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()。

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。

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,因此結果不可預期。

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