首先引入一道題:完成下面的函數。
/* @Description:使用傳入的參數格式化字符串string 用第一個參數替換{0},第二個參數替換{1}... @param:string 格式如 this is test {0}{1} @param:data 如果data=hello,用該值替換string后的值為 this is test hello{1} */ function stringFormat(string,data) { }
我想到得解決方案是遍歷實參,逐個替換模板字符串中相應位置的值。
function stringFormat(string,data) { for(var i=1;i<arguments.length;i++) { string = string.replace(eval('/\\{'+(i-1)+'\\}/g'),arguments[i]); } return string; }
這里面使用正則表達式有兩點需要注意:
1、正則表達式中使用變量。一定要使用eval將組合的字符串進行轉換,不能直接將字符串傳入給replace函數。
2、正則表達式中{} []等保留符號,前面需要加轉義符 \ 標識,而且需要加兩個,如果加一個最終組合出的正則表達式為{0},這表示匹配0次,而並不是匹配字符串"{0}"。
另外一種實現方式,不使用eval,正則表達式使用RegExp創建。
function stringFormat(value,reg1){ for(var i=1;i<arguments.length;i++) { var reg=new RegExp('\\{'+(i-1)+'\\}'); value=value.replace(reg,arguments[i]); } return value; }