本文介绍如何在 JavaScript 中模拟 C# 的字符串格式化功能。通过扩展 String.prototype,实现支持对象属性名替换和索引占位符替换的 format 方法。代码利用正则表达式匹配 {key} 或 {index} 格式,分别处理对象直接量和参数列表两种场景,提供灵活的字符串拼接方案。
JavaScript 实现 C# 风格的字符串格式化方法
JavaScript 模拟 C# 字符串格式化操作
基础实现:基于索引的格式化
/***
** 功能: 字符串格式化替换操作
***/
String.prototype.format = function () {
var args = arguments;
return this.replace(/\{(\d+)\}/g,
function (m, i) {
return args[i];
});
}
在 JavaScript 中实现类似 C# 的字符串处理函数 format():
熟悉 C# 开发的开发者应该了解 format() 方法,下文将演示如何在 JavaScript 中实现相同的功能。
代码实例如下:
增强实现:支持对象属性与索引混合格式化
String.prototype.format=function(args){
if(arguments.length>0){
var result=this;
if(arguments.length==1&&typeof(args)=="object"){
for(var key in args){
var reg=new RegExp("({"+key+"})","g");
result=result.replace(reg, args[key]);
}
}
else{
for(var i=0;i<arguments.length;i++){
if(arguments[i]==undefined){
return "";
}
else{
var reg=new RegExp ("({["+i+"]})","g");
result = result.replace(reg, arguments[i]);
}
}
}
return result;
}
else{
return this;
}
}
var fistStr="{0}欢迎您,希望大家能够得到想要的{1}";
var secondStr="{webName}欢迎您,希望大家能够得到想要的{favoriate}";
var firstOut=fistStr.format("","东西");
var secondOut=secondStr.format({webName:"",favoriate:"东西"});
console.log(firstOut);
console.log(secondOut);
上述代码实现了预期的效果,接下来详细介绍其实现原理。
实现原理与代码详解
一、实现原理:
原理较为直观,具体逻辑可参考代码注释。核心思路是使用正则表达式定位需要替换的字符串片段,随后使用指定的内容进行替换。在代码中,指定的内容既可以是直接的字符串字面量,也可以是对象的属性值。
二、代码注释:
1. String.prototype.format=function(args){{}},通过原型链为 String 对象添加实例方法 format,该方法用于执行字符串处理逻辑。
2. if(arguments.length>0),判断传入的参数数量是否大于 0。
3. var result=this,将当前字符串对象的引用赋值给变量 result。
4. if(arguments.length==1&&typeof(args)=="object"),用于判断传入的参数是否为一个对象字面量。
5. for(var key in args),遍历对象字面量中的各个属性。
6. var reg=new RegExp("({"+key+"})","g"),构建正则表达式以匹配指定的字符串占位符。
7. result=result.replace(reg,args[key]),使用对象的属性值替换匹配到的字符串。
8. else{},当传入的参数不是对象字面量时执行此分支。
9. for(var i=0;i<arguments.length;i++),遍历传入的所有参数。
10. if(arguments[i]==undefined),如果参数值为 undefined,则返回空字符串。
11. var reg=new RegExp("({["+i+"]})","g"),构建正则表达式以匹配指定索引的字符串。
12. result=result.replace(reg,arguments[i]),执行字符串替换操作。
13. return result,返回替换完成后的字符串。
14. return this,若未传入任何参数,则直接返回原始字符串。