javascript下利用arguments实现string.format函数


Posted in Javascript onAugust 24, 2010

下面摘抄一下源码,深入分析一下他的设计实现思路:

function format(string) { 
var args = arguments; 
var pattern = new RegExp("%([1-" + arguments.length + "])", "g"); 
return String(string).replace(pattern, function(match, index) { 
return args[index]; 
}); 
};

通过format函数,下面的代码:
format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");

就会返回:"And the papers want to know whose shirt you wear" 。
果然有点像c#下string.format函数一样传参调用。
总体说来,好像真没什么技术含量。但是真的没有技术含量吗?楼猪大胆根据自己对javascript和arguments的浅薄认识和理解,再来剖析一下这段程序:
1、正则表达式
非常巧妙地new了一个以%开头匹配1到argument个数的一个正则pattern,这个正则是下面第2点字符串替换的重要前提准备;
2、string的Replace函数
replace函数的第二个参数是function,这点非常令人“意外”。通过定义,变量args实际上就是arguments,接着通过args[index]就能取到第index个参数,而且index>=1且index<arguments.length又能保证获取参数的正确。

函数如此短小精悍,和强大的功能形成巨大反差,令人拍案。
可能有许多像楼猪一样被c#惯坏的开发者,会迷恋c#的string.format的写法(大部分还是使用习惯在作怪吧?),好事楼猪稍微改动了一下源码:

function format(string) { 
var args = arguments; 
var pattern = new RegExp("{([0-" + arguments.length + "])}", "g"); 
return String(string).replace(pattern, function(match, index) { 
var currentIndex = parseInt(index); 
if (currentIndex + 1 > args.length || currentIndex < 0) { 
throw new Error("参数索引出错"); 
} 
return args[currentIndex + 1]; 
}); 
}; 
document.write(format("And the {0} want to know whose {1} you {2}", "papers", "shirt", "wear"));//大括号,索引从0开始...

这样看上去就可以像c#的编写风格一样调用format函数了。
最后查看此文的写作时间是在2008年,楼猪在08年的时候觉悟还算蛮高的,正自发努力学习javascript中,但是对arguments认识还很稚嫩,虽然已经知道可以在自定义事件中通过它来定义createFunction函数,用createFunction函数来构造无参数的function给事件使用,但是当时一直抑郁“只知其形,不得其实”。看完Andrew的佳作,豁然开朗,虽然反应迟钝后知后觉,依然感到无比振奋和欣慰。

你看一下Andrew Tetlaw的原文吧。其实下面已经有人指出format函数参数超出9以后,该函数就不起作用了,然后还给出了解决方法:

eric d. Hi, thanks for that brilliant article. Made a lot of things a lot clearer!
Note: new RegExp("%([1-" + arguments.length + "])", "g"); will fail passed 9 arguments (the regexp would be "%([1-10])" so it will only match %0 and %1).

I think an easy fix would be something like:
function format(string) { var args = arguments; var pattern = new RegExp("%([0-9]+)", "g"); return String(string).replace(pattern, function(match, index) { if (index == 0 || index >= args.length) throw "Invalid index in format string"; return args[index]; }); };
(Sorry for nitpicking, I understand it was only an example and brevety is the main objective, but its a great function to have)

Posted on: January 20th 2009, 12:01 am

Javascript 相关文章推荐
用js实现的检测浏览器和系统的函数
Apr 09 Javascript
JavaScript Eval 函数使用
Mar 23 Javascript
教您去掉ie网页加载进度条的方法
Dec 09 Javascript
jquery中动态效果小结
Dec 16 Javascript
javascript html5摇一摇功能的实现
Apr 19 Javascript
Three.js学习之文字形状及自定义形状
Aug 01 Javascript
使用BootStrapValidator完成前端输入验证
Sep 28 Javascript
Ionic2系列之使用DeepLinker实现指定页面URL
Nov 21 Javascript
浅析BootStrap中Modal(模态框)使用心得
Dec 24 Javascript
jquery实现图片跟随鼠标的实例
Oct 17 jQuery
JavaScript模板引擎原理与用法详解
Dec 24 Javascript
浅谈Three.js截图并下载的大坑
Nov 01 Javascript
基于jQuery的淡入淡出可自动切换的幻灯插件
Aug 24 #Javascript
js null,undefined,字符串小结
Aug 21 #Javascript
javascript中的float运算精度实例分析
Aug 21 #Javascript
Firebug入门指南(Firefox浏览器)
Aug 21 #Javascript
jquery插件之easing 动态菜单
Aug 21 #Javascript
url地址自动加#号问题说明
Aug 21 #Javascript
jquery中输入验证中一个不错的效果
Aug 21 #Javascript
You might like
PHP中的加密功能
2006/10/09 PHP
如何把PHP转成EXE文件
2006/10/09 PHP
php网上商城购物车设计代码分享
2012/02/15 PHP
php解析xml提示Invalid byte 1 of 1-byte UTF-8 sequence错误的处理方法
2013/11/14 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
CSDN轮换广告图片轮换效果
2007/03/27 Javascript
奇妙的js
2007/09/24 Javascript
JavaScript和JQuery实用代码片段(一)
2010/04/07 Javascript
JQuery获取与设置HTML元素的内容或文本的实现代码
2014/06/20 Javascript
jQuery获取某天的农历日期并判断是否除夕或新年的方法
2016/03/01 Javascript
Javascript实现图片加载从模糊到清晰显示的方法
2016/06/21 Javascript
jQuery实现动态文字搜索功能
2017/01/05 Javascript
vuejs父子组件通信的问题
2017/01/11 Javascript
Vue.js学习之计算属性
2017/01/22 Javascript
Vue 中axios配置实例详解
2018/07/27 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
使用uni-app开发微信小程序的实现
2019/12/13 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
python下函数参数的传递(参数带星号的说明)
2010/09/19 Python
Python运用于数据分析的简单教程
2015/03/27 Python
Python自动化测试ConfigParser模块读写配置文件
2016/08/15 Python
python构建自定义回调函数详解
2017/06/20 Python
python解决js文件utf-8编码乱码问题(推荐)
2018/05/02 Python
Python音频操作工具PyAudio上手教程详解
2019/06/26 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
Django REST 异常处理详解
2020/07/15 Python
多个版本的python共存时使用pip的正确做法
2020/10/26 Python
python中doctest库实例用法
2020/12/31 Python
美国照明、家居装饰和家具购物网站:Bellacor
2017/09/20 全球购物
美国时尚配饰品牌:Dooney & Bourke
2017/11/14 全球购物
运动会致辞稿50字
2014/02/04 职场文书
机械专业应届毕业生自荐书
2014/06/12 职场文书
教师个人成长总结
2015/02/11 职场文书
党员“一帮一”活动总结
2015/05/07 职场文书
导游词之天下银坑景区
2019/11/21 职场文书
Go gRPC进阶教程gRPC转换HTTP
2022/06/16 Golang