1. 程式人生 > >JavaScript字串格式化輸出

JavaScript字串格式化輸出

js過程中常常會用到字串拼接,很多時候這些拼接又長又硬,而js又沒有提供像其他語言一樣的字串格式化方式,於是我們只好DIY了。

一般來說,我們需要實現如下兩種方式的格式化:

"{0},{1},hehe".format("hello","world") "數學={數學},語文={語文},hou".format({"數學":100,"語文":95})

第一種是常規的格式化方法 ,很多語言中常見。第二種就不那麼常見了 ,但是在Js中卻很重要,特別是在ajax互動式後我們返回一堆的json資料。當然有很多人都寫過相容的format寫法,但我們今天要嘗試另外一些方法。

仔細觀察上面的2中格式話方法,我們發現方法簽名相同,但引數有所不同。不正好用到

JavaScript函式過載模擬一文中的方法過載麼?那麼就應該有如下的實現:

sm.Overload("format",String.prototype,{ "string,string,string...." : function(a,b,c,....){ //pass }, "object" : function(param){ //pass } });

寫完之後發現有點糾結,我們的Overload方法是根據fn_obj物件的鍵值(如上面程式碼的"string,string,string....")來給定相對的實現的,但是string的個數確實不確定的,我們無法用它來當一個確定的鍵值。

怎麼辦呢?

很容易! 這一堆的string不就代表一個string集合麼?用一個Array表示就行了啊。so...

sm.Overload("format",String.prototype,{ "array" : function(params){ //params is a array }, "object" : function(param){ //param is a object } });


剩下的程式碼就很好寫了:

sm.Overload("format",String.prototype,{ "array" : function
(params){ var reg = /{(\d+)}/gm; return this.replace(reg,function(match,name){ return params[~~name]; }); }, "object" : function(param){ var reg = /{([^{}]+)}/gm; return this.replace(reg,function(match,name){ return param[name]; }); } });

呼叫之:

"{0},{1},hehe".format(["hello","world"]); //hello,world,hehe "數學={數學},語文={語文},hou".format({"數學":100,"語文":95});//數學=100,語文=95,hou

對函式簽名相同引數不同的函式進行方法過載好處顯而易見,每一中情況你都可以針對行的寫出新的函式,而不是用一大堆的If,else。如果再有其他形式的格式化方式,你只需要用sm.Overload對String.prototype.format進行擴充套件即可,而不是去一個all方法裡新增If。