下面摘抄一下原始碼,深入分析一下他的設計實作想法:
程式碼如下:
function format(string) { var args=arguments; var pattern=new RegExp("%([1-" + arguments.length + "])", "g"); return String(string).replace(pattern, function(match, index) { return args[index]; }); };
透過format函數,下面的程式碼:
程式碼如下:
rrrereee to know whose shirt you wear" 。
果然有點像c#下string.format函數一樣傳參呼叫。
整體說來,好像真是沒什麼技術含量。但真的沒有技術含量嗎?樓豬大膽根據自己對javascript和arguments的淺薄認識和理解,再來剖析一下這段程序:
1、正則表達式
非常巧妙地new了一個以%開頭匹配1到argument個數的一個正則pattern,這個正規是下面第2點字串替換的重要前提準備;
2、string的Replace函數
replace函數的第二個參數是function,這點非常令人「意外」。透過定義,變數args其實就是arguments,接著透過args[index]就能取到第index個參數,而且index>=1且index
函數如此短小精悍,和強大的功能形成巨大反差,令人拍案。
可能有許多像樓豬一樣被c#慣壞的開發者,會迷戀c#的string.format的寫法(大部分還是使用習慣在作怪吧?),好事樓豬稍微改動了一下源碼:
代碼如下:
format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");
這樣看上去就可以像c#的寫風格一樣呼叫format函數了。
最後查看此文的寫作時間是在2008年,樓豬在08年的時候覺悟還算蠻高的,正自發努力學習javascript中,但是對arguments認識還很稚嫩,雖然已經知道可以在自定義事件中透過它來定義createFunction函數,用createFunction函數來建構無參數的function給事件使用,但是當時一直憂鬱「只知其形,不得其實」。看完Andrew的佳作,豁然開朗,雖然反應遲鈍後知後覺,依然感到無比振奮和欣慰。