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 相关文章推荐
分析 JavaScript 中令人困惑的变量赋值
Aug 13 Javascript
JQuery对id中含有特殊字符的转义处理示例
Sep 06 Javascript
javascript回车完美实现tab切换功能
Mar 13 Javascript
jquery对象和javascript对象即DOM对象相互转换
Aug 07 Javascript
Javascript验证方法大全
Sep 21 Javascript
JS表单验证的代码(常用)
Apr 08 Javascript
浅谈DOCTYPE对$(window).height()取值的影响
Jul 21 Javascript
关于JS Lodop打印插件打印Bootstrap样式错乱问题的解决方案
Dec 23 Javascript
mac上node.js环境的安装测试
Jul 03 Javascript
基于jquery实现多选下拉列表
Aug 02 jQuery
实例分析vue循环列表动态数据的处理方法
Sep 28 Javascript
区分vue-router的hash和history模式
Oct 03 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+FLASH实现上传文件进度条相关文件 下载
2007/07/21 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
详解PHP中array_rand函数的使用方法
2016/09/11 PHP
thinkPHP框架中执行原生SQL语句的方法
2017/10/25 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
传智播客学习之java 反射
2009/11/22 Javascript
JavaScrip单线程引擎工作原理分析
2010/09/04 Javascript
使用CoffeeScrip优美方式编写javascript代码
2015/10/28 Javascript
牛叉的Jquery——Jquery与DOM对象的互相转换及DOM的三种操作
2015/10/29 Javascript
node+experss实现爬取电影天堂爬虫
2016/11/20 Javascript
js获取元素的偏移量offset简单方法(必看)
2017/07/05 Javascript
ES6中的rest参数与扩展运算符详解
2017/07/18 Javascript
Vue ElementUI之Form表单验证遇到的问题
2017/08/21 Javascript
vuex state及mapState的基础用法详解
2018/04/19 Javascript
微信小程序 调用微信授权窗口相关问题解决
2019/07/25 Javascript
Python实现删除Android工程中的冗余字符串
2015/01/19 Python
在Python中处理字符串之isdecimal()方法的使用
2015/05/20 Python
详解Python的Flask框架中的signals信号机制
2016/06/13 Python
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
python按行读取文件,去掉每行的换行符\n的实例
2018/04/19 Python
Python读取Pickle文件信息并计算与当前时间间隔的方法分析
2019/01/30 Python
PyQt弹出式对话框的常用方法及标准按钮类型
2019/02/27 Python
python3 打印输出字典中特定的某个key的方法示例
2019/07/06 Python
python 爬取马蜂窝景点翻页文字评论的实现
2020/01/20 Python
美国高档百货Nordstrom的折扣店:Nordstrom Rack
2017/11/13 全球购物
俄罗斯在线服装店:STOLNIK
2021/03/07 全球购物
工程招投标邀请书
2014/01/26 职场文书
公司端午节活动方案
2014/02/04 职场文书
成本会计岗位职责
2015/02/03 职场文书
中学生社区服务活动报告
2015/02/05 职场文书
南京大屠杀观后感
2015/06/02 职场文书
2016读书月活动心得体会
2016/01/14 职场文书
《我们的民族小学》教学反思
2016/02/19 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
Python实现查询剪贴板自动匹配信息的思路详解
2021/07/09 Python