ECMAScript提供了三個基于子字符串創(chuàng)建新字符串的方法: slice()、 substr()和substring()。
這三個方法都會返回被操作字符串的一個子字符串,而且也都接受一或兩個參數(shù)。
- 第一個參數(shù)指定子字符串的開始位置,
- 第二個參數(shù)(在指定的情況下)表示子字符串到哪里結(jié)束。具體來說, slice()和substring()的第二個參數(shù)指定的是子字符串最后一個字符后面的位置。而 substr()的第二個參數(shù)指定的則是返回的字符個數(shù)。
如果沒有給這些方法傳遞第二個參數(shù),則將字符串的長度作為結(jié)束位置。
slice()、 substr()和 substring()也不會修改字符串本身的值——它們只是返回一個基本類型的字符串值,對原始字符串沒有任何影響。
var stringValue = "hello world";
alert(stringValue.slice(3)); //"lo world"
alert(stringValue.substring(3)); //"lo world"
alert(stringValue.substr(3)); //"lo world"
alert(stringValue.slice(3, 7)); //"lo w"
alert(stringValue.substring(3,7)); //"lo w"
alert(stringValue.substr(3, 7)); //"lo worl"
在傳遞給這些方法的參數(shù)是負值的情況下,它們的行為就不盡相同了
其中, slice()方法會將傳入的負值與字符串的長度相加,
substr()方法將負的第一個參數(shù)加上字符串的長度,而將負的第二個參數(shù)轉(zhuǎn)換為 0。
substring()方法會把所有負值參數(shù)都轉(zhuǎn)換為 0。
var stringValue = "hello world";
alert(stringValue.slice(-3)); //"rld"
alert(stringValue.substring(-3)); //"hello world"
alert(stringValue.substr(-3)); //"rld"
alert(stringValue.slice(3, -4)); //"lo w"
alert(stringValue.substring(3, -4)); //"hel"
alert(stringValue.substr(3, -4)); //""(空字符串)
這個例子清晰地展示了上述三個方法之間的不同行為。
在給 slice()和 substr()傳遞一個負值參數(shù)時,它們的行為相同。
這是因為-3 會被轉(zhuǎn)換為 8(字符串長度加參數(shù) 11+(?3)=8)實際上相當于調(diào)用了 slice(8)和 substr(8)。但 substring()方法則返回了全部字符串,因為它將-3 轉(zhuǎn)換成了 0。-
當?shù)诙€參數(shù)是負值時,這三個方法的行為各不相同。
slice()方法會把第二個參數(shù)轉(zhuǎn)換為 7,這就相當于調(diào)用了 slice(3,7),因此返回"lo w"。
substring()方法會把第二個參數(shù)轉(zhuǎn)換為 0,使調(diào)用變成了 substring(3,0),而由于這個方法會將較小的數(shù)作為開始位置,將較大的數(shù)作為結(jié)束位置,因此最終相當于調(diào)用了 substring(0,3)。
substr()也會將第二個參數(shù)轉(zhuǎn)換為 0,這也就意味著返回包含零個字符的字符串,也就是一個空字符串。
參考資料:《javaScript高級程序設計第三版》