JavaScript字串格式化輸出
阿新 • • 發佈:2019-01-22
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。