首先引入一道题:完成下面的函数。
/* @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; }