最近讀了sharpxiajun的博文《javascript筆記--String類replace函數(shù)的一些事》,感覺寫的很好,很有幫助。對(duì)回調(diào)函數(shù)的參數(shù)說明也很準(zhǔn)確:
第一個(gè)參數(shù)是匹配到的字符串,最后一個(gè)是原字符串,倒數(shù)第二個(gè)參數(shù)是匹配到的字符串的在原字符串索引的起始位。
但我很好奇,第二到倒數(shù)第三之間的參數(shù)又是些什么呢?其實(shí),W3school已經(jīng)給出了答案:
replace() 方法用于在字符串中用一些字符替換另一些字符,或替換一個(gè)與正則表達(dá)式匹配的子串。其語法為:
stringObject.replace(regexp/substr,replacement)
replacement 可以是字符串,也可以是函數(shù)。如果它是字符串,那么每個(gè)匹配都將由字符串替換。
ECMAScript v3 規(guī)定,replace() 方法的參數(shù) replacement 可以是函數(shù)而不是字符串。
在這種情況下,每個(gè)匹配都調(diào)用該函數(shù),它返回的字符串將作為替換文本使用。
該函數(shù)的第一個(gè)參數(shù)是匹配模式的字符串。接下來的參數(shù)是與模式中的子表達(dá)式匹配的字符串,可以有 0 個(gè)或多個(gè)這樣的參數(shù)。
接下來的參數(shù)是一個(gè)整數(shù),聲明了匹配在 stringObject 中出現(xiàn)的位置。
最后一個(gè)參數(shù)是 stringObject 本身。
顯然,replacement函數(shù)的第二到倒數(shù)第三之間的參數(shù)是“與模式中的子表達(dá)式匹配的字符串”,具體個(gè)數(shù)起決于子表達(dá)式的個(gè)數(shù)。
據(jù)此,我們舉兩個(gè)例子來對(duì)比說明:
例1:
字符串:"CJ9080"
匹配模式為:/CJ[0-9]{2}/g (無子表達(dá)式)
預(yù)期結(jié)果:
replacement函數(shù)有3個(gè)參數(shù),分別為:
【0】“CJ90”
【1】0
【2】“CJ9080”
測試代碼:
function replaceStr(s) {
return s.replace(/CJ[0-9]{2}/g,
function(){
for (var i = 0, len = arguments.length; i < len; i++) {
console.info("Argument " + i + ": " + arguments[i]);
}
});
};
運(yùn)行結(jié)果:
例2:
字符串:"CJ9080"
匹配模式為:/((CJ)([0-9]{2}))/g (有3個(gè)子表達(dá)式:(CJ[0-9]{2}), (CJ), ([0-9]{2}))
預(yù)期結(jié)果:
replacement函數(shù)有6個(gè)參數(shù),分別為:
【0】 "CJ90"
【1】 "CJ90"
【2】 "CJ"
【3】 "90"
【4】 0
【5】 "CJ9080"
測試代碼:
function replaceStr(s) {
return s.replace(/((CJ)([0-9]{2}))/g,
function(){
for (var i = 0, len = arguments.length; i < len; i++) {
console.info("Argument " + i + ": " + arguments[i]);
}
});
};
運(yùn)行結(jié)果:
顯然,兩個(gè)測試?yán)咏Y(jié)果均與預(yù)期一致。說明,當(dāng)replace函數(shù)的replacement為函數(shù)時(shí),此函數(shù)的參數(shù)各位確如W3school所言:
【0】:匹配模式的字符串;
【1 - (length - 3)】: 與模式中的子表達(dá)式匹配的字符串, 0個(gè)或多個(gè);
【length - 2】:匹配串在原字符串的索引起始位置,從0開始;
【length - 1】:原字符串。