首頁  >  文章  >  web前端  >  javascript下利用arguments實作string.format函數

javascript下利用arguments實作string.format函數

高洛峰
高洛峰原創
2016-12-14 10:03:051107瀏覽

下面摘抄一下原始碼,深入分析一下他的設計實作想法: 

程式碼如下:

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的佳作,豁然開朗,雖然反應遲鈍後知後覺,依然感到無比振奮和欣慰。 

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn