JS 没有提供方便使用的 Formatter 函数,用字符拼接的方式看起来混乱难读,下面是 JS 简单实现版本 (没有严格测试)
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
JS 原生并没有提供方便使用的 Formatter 函数,用字符拼接的方式看起来混乱难读,而且使用起来很不方便。个人感觉 C# 里提供的语法比较好用,如:
- String.Format("Welcome to learn '{0}', '{0}'is awesome, you will {
- 1
- }
- it ! ","Javascript ","love ");"
这种有顺序的替换方式,比较清晰,而且在要替换同一内容时候可以省去传递重复参数的情况,下面是 JS 简单实现版本 (没有严格测试):
- (function(exports) {
- exports.format = function(){
- var args = Array.prototype.slice.call(arguments),
- sourceStr = args.shift();
- function execReplace(text,replacement,index){
- return text.replace(new RegExp("\\{"+index+"\\}",'g'),replacement);
- }
- return args.reduce(execReplace,sourceStr);
- }
- })(window.utils = window.utils || {});
- console.log(utils.format("Welcome to learn '{0}','{0}' is awesome,you will {1} it!","Javascript","love"));
关键的是这句:
- args.reduce(execReplace,sourceStr);
这里使用了 Array 的 reduce 函数, reduce 和 reduceRight 是 ES5 新增加的函数,该函数的参数是 reduce(callback,initialValue),callback 接收 4 个参数分别是:
previousValue:
在遍历第一次进入该回调函数时,如果指定了 initivalValue 将直接使用 initivalValue,如果没有指定将使用数组的第一个元素
第二次及以后的遍历该值是前一次遍历返回的结果
最后一次遍历返回的结果将作为 reduce 函数的返回值
currentValue: 遍历到的当前 item
index: 当前 item 在数组中的下标
array: 原始 array
在 execReplace 中每一次执行时使用前一次替换后的结果作为原始替换字符串,使用当前 item 的 index 作为要被替换的内容,依次遍历,最终完成替换内容。
注:reduceRight 和 reduce 函数基本一样,只是它的遍历顺序是由右向左
来源: