對回呼函數的參數說明也很準確:
第一個參數是匹配到的字串,最後一個是原字串,倒數第二個參數是匹配到的字串的在原字串索引的起始位。
但我很好奇,第二到倒數第三之間的參數又是些什麼呢?其實,W3school已經給出了答案:
複製代碼 代碼如下:replace() 方法用於在字串中用一些字元替換另一些字元,或替換一個與Regex匹配的子串。其文法為:
stringObject.replace(regexp/substr,replacement)
replacement 可以是字串,也可以是函數。如果它是字串,那麼每個匹配都將由字串替換。
ECMAScript v3 規定,replace() 方法的參數 replacement 可以是函數而不是字串。在這種情況下,每個匹配都調用該函
數,它返回的字串將作為替換文本使用。該函數的第一個參數是匹配模式的字串。接下來的參數是與模式中的子運算式匹配的
字串,可以有 0 個或多個這樣的參數。接下來的參數是一個整數,聲明了匹配在 stringObject 中出現的位置。最後一個參數
是 stringObject 本身。
顯然,replacement函數的第二到倒數第三之間的參數是“與模式中的子運算式匹配的字串”,具體個數起決於子運算式的個數。
據此,我們舉兩個例子來對比說明:
例1:
字串:"CJ9080"
匹配模式為:/CJ[0-9]{2}/g (無子運算式)
預期結果:
replacement函數有3個參數,分別為:
【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]);
}
});
};
運行結果:
例2:
字串:"CJ9080"
匹配模式為:/((CJ)([0-9]{2}))/g (有3個子運算式:(CJ[0-9]{2}), (CJ), ([0-9]{2}))
預期結果:
replacement函數有6個參數,分別為:
【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]);
}
});
};
運行結果:
顯然,兩個測試例子結果均與預期一致。說明,當replace函數的replacement為函數時,此函數的參數各位確如W3school所言:
【0】:匹配模式的字串;
【1 - (length - 3)】: 與模式中的子運算式匹配的字串, 0個或多個;
【length - 2】:匹配串在原字串的索引起始位置,從0開始;
【length - 1】:原字串。