若是用过C#会发现String.Format是功能很是强大的字符串替换方法。c#
而在Js中,仅仅是提供了一个.replace方法。而且只能替换匹配到的第一字符串。须要进行大量的二次包装或则循环使用。数组
固然也能够经过正则来进行。可是又至关的麻烦以及代码的可读性不好。app
为何咱们不能经过对String的扩展来提供相似c#的String.Format的功能呢?ide
老规矩,核心代码奉上。this
String.prototype.Format = function () { var returnValue = this; for (var i = 0; i < arguments.length; i++) { var arg = arguments[i]; var key = ""; var value = ""; //参数若是为string 则使用传统的查找{i}进行替换 if (typeof arg == "string") { key = i; value = arg; } else if (arg instanceof Array) { //若是参数为数组则转为传统的Format调用方式进行二次调用 returnValue = returnValue.Format.apply(returnValue, arg); continue; } else { //若是参数为对象,则按照KeyValue数据格式进行替换 key = arg.key; value = arg.value; } //设置须要转译的保留符号 var keySymple = [ { reg: /\\/ig, value: "\\\\" }, { reg: /\{/ig, value: "\\{" }, { reg: /\}/ig, value: "\\}" }, { reg: /\)/ig, value: "\\)" }, { reg: /\(/ig, value: "\\(" }, ] //查找保留符号进行转译 for (var j = 0; j < keySymple.length; j++) { var sympleReplace = keySymple[j]; key = key.toString().replace(sympleReplace.reg, sympleReplace.value); } var reg = new RegExp("\\{" + key + "\\}", "ig"); returnValue = returnValue.replace(reg, value); } return returnValue; }
而后接着就是使用代码了prototype
var demoStr="this is a {0} {1}" demoStr.Format("hot","day")//return "this is a hot day" demoStr.Format(["hot","day"])//return "this is a hot day" var demoStr="my name is {Name},age {Age}" demoStr.Format({key:"Name",value:"Happy"},{key:"Age",value:"20"}) //return "my name is Happy,age 20" demoStr.Format([{key:"Name",value:"Happy"},{key:"Age",value:"20"}]) //return "my name is Happy,age 20"
参数支持params和array两种结构orm
同时支持string以及{key:,value:,}两种数据对象