iT邦幫忙

1

javascript replace() 實作 function當作參數的作法的問題

各位先進好,
關於javascript原生function replace中把function當作參數的作法的問題,
下方程式碼中replace(/{([^{}]*)}/g,function(a,b){...}) 我下中斷點去看,
發現參數a,b分別代表replace前、後的資料,請問實際上他是怎麼去做對應的呢?

if (!String.prototype.supplant) {
    String.prototype.supplant = function (o) {
        return this.replace(/{([^{}]*)}/g,
            function (a, b) {//a:原型,b:replace後的值
                var r = o[b];
                return typeof r === 'string' || typeof r === 'number' ? r : a;
            }
        );
    };
}
weiclin iT邦高手 4 級 ‧ 2018-07-30 16:27:13 檢舉
去爬原始碼
https://chromium.googlesource.com/v8/v8/+/4.3.49/src/string.js
謝謝你提供的連結,我正在研究。

1 個回答

0

怎麼對應的? replace函數的兩個參數:

a = searchvalue
b = newvalue
str.replace(searchvalue, newvalue)
看更多先前的回應...收起先前的回應...

可能是我問的沒有很清楚
我指的是說如果newvalue是使用function的情況之下,
其中function(a,b,c..)他的參數傳遞的機制。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace
MDN有解釋說在function作為參數的情況下它本身的參數所代表的意思,但我這邊想搞懂的地方是他replace這個function是如何實現的,我在想他是不是在replace宣告上有使用到call 或 apply

這是custom function的作法,表示可以讓使用者自訂取代的方式,實現方式就是提供傳入function, 並將replace(a, b)的參數,傳給自訂的function test(a,b)

fillano iT邦超人 1 級 ‧ 2018-07-30 16:52:25 檢舉

底層實現並不是Javascript吧XD

理解底層實現是要? 自己寫一套javascript? 有什麼意義嗎?

weiclin iT邦高手 4 級 ‧ 2018-07-30 17:27:38 檢舉

可以當作學習, 也可以更理解這個語言, 有時候還可以偷學到一點官方密技

fillano iT邦超人 1 級 ‧ 2018-07-30 17:36:11 檢舉

先看懂ECMA-262規格書吧XD,Javascript實做都是遵循規格書的...內建物件在很後面,沒記錯的話應該是最後一章

另外,大部分Javascript引擎例如V8、SpiderMonkey等都是OpenSource,可以研究一下他的原始碼。(V8用C++,SpiderMonkey是C)

典型的走火入魔,適合太閒的人,如果是js語法也就罷了,
已經不是js的範圍,與其花時間去了解,還不如把js學得熟練一點

fillano
感謝你提供的建議跟資源!!
原本是想說 replace 看起來應該只是透過js寫出來的函式,
另外,也是因為說想練習使用callback,所以就以看起來好像是用這方式寫出來的例子當作參考了。
不過kksugsay說的也沒有不對,在做這練習的時候我確實是蠻閒的XD,但不過就是希望在閒暇的時候能抱持好奇心去學習。

請勿理會這段留言,剛剛因為連線異常,留言重複...
而且好像沒辦法刪除自己的留言阿QQ

fysh711426 iT邦研究生 4 級 ‧ 2018-07-30 20:01:33 檢舉

您的問題都蠻有趣的,我也常對一些 特別 的地方感到好奇。

看了 weiclin 大提供的原始碼,重點部分真的不是 JS,%StringReplaceGlobalRegExpWithString 應該就是原生函數了。

var answer = %StringReplaceGlobalRegExpWithString(
            subject, search, replace, $regexpLastMatchInfo);

找到 C++ 原始碼
https://github.com/v8/v8/blob/master/src/runtime/runtime-regexp.cc
不過太複雜了,小弟就不研究了,我知道它是個 callback 就好了,哈哈哈。
/images/emoticon/emoticon16.gif

我要發表回答

立即登入回答