2010-11-06 38 views
9

我在閱讀此功能的書中似乎遇到了衝突的建議。 我想知道如果有人可以澄清。 例如尼古拉斯Zakas規定函數參數的格式 功能的簽名(匹配,POS,originalText)(P139:Wrox的:對於網頁開發第二版專業版的JavaScript)JavaScript字符串用正則表達式和函數替換爲參數

他接着說,當正則表達式有一個匹配,函數獲得三個參數(如上)。當有多個捕獲組時,每個匹配的字符串作爲參數傳入,最後兩個位置是位置和originalText ...

然後我們來到Doug Crockfords,JavaScript:The Good Parts。 (P90): 他規定的語法再次作爲字符串(searcValue,replaceValue) searchValue可以是一個正則表達式 - 很棒的匹配.. 如果replaceValue是一個函數,第一個參數是匹配的文本,那麼第二個是捕獲組1 ,第三個是捕獲組2等等。 這裏有一個明顯的區別。 (即沒有位置參數)

我還在尋找Pro JavaScript設計模式(APress P152)中的一個例子,它啓動了整個交叉引用過程。這些人(羅斯哈默斯/達斯汀迪亞茲),而不是無意地指定replaceValue函數與兩個參數名爲a & b。但它往往強化Doug Crockford所描述的概念。

有人可以確認尼古拉斯扎卡斯描述是否確實是一個有效的選擇嗎?

回答

8

Zakas是正確的,倒數第二個和最後一個參數是posoriginalText。從ECMA-262和3rd版本5th(第15.5.4.11):

如果replaceValue是一個函數,那麼對於每個匹配的子串,調用與下列 + 3參數的函數。參數1是匹配的子字符串。如果searchValue是正則表達式,則下一個參數是MatchResult(參見15.10.2.1)中的所有捕獲。參數m + 2是匹配發生的字符串內的偏移量,參數m + 3是string

請注意String.prototype.replace是ECMA-262第3版中的新增內容。用於JavaScript的JScript和MDC文檔的MSDN文檔均符合此規範。

+0

感謝您的鏈接和。尤其是Moziila尤其棒極了。 – JGFMK 2010-11-06 17:17:28

4

ECMAScript的規格具有:

String.prototype.replace (searchValue, replaceValue) 

如果searchValue是正則表達式(一個對象,其[[類]]屬性是「正則表達式「),請執行以下操作:如果searchValue。 global爲false,然後搜索正則表達式searchValue的第一個匹配字符串。如果searchValue。global是true,然後搜索正則表達式searchValue的所有匹配的字符串。按照與String.prototype.match相同的方式執行搜索,包括searchValue的更新。 lastIndex的。設m爲searchValue中左側捕獲括號的數量(按照15.10.2.1的規定,NCapturingParens)。

如果searchValue不是正則表達式,則讓searchString爲ToString(searchValue)並搜索字符串,以搜索第一次出現的searchString。令m爲0.

如果replaceValue是一個函數,則對於每個匹配的子字符串,使用以下m + 3個參數調用該函數。參數1是匹配的子字符串。如果searchValue是一個正則表達式,那麼接下來的m個參數就是MatchResult中的所有捕獲(見15.10.2.1)。參數m + 2是匹配發生的字符串內的偏移量,參數m + 3是字符串。結果是從原始輸入派生的字符串值,方法是將每個匹配的子字符串替換爲函數調用的相應返回值,如果需要將其轉換爲字符串。

這有點令人困惑,但我認爲Zakas是正確的。

+0

感謝您的回覆。你有鏈接到規範? – JGFMK 2010-11-06 17:01:47

+0

http://bclary.com/2004/11/07/ for rev 3 html。官方網站是http://www.ecmascript.org/docs.php – 2010-11-06 17:02:14

+0

歡呼的鏈接 – JGFMK 2010-11-06 17:06:17