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 相关文章推荐
jquery中focus()函数实现当对象获得焦点后自动把光标移到内容最后
Sep 29 Javascript
JS测试显示屏分辨率以及屏幕尺寸的方法
Nov 22 Javascript
JS替换字符串中空格方法
Apr 17 Javascript
简单理解JavaScript中的封装与继承特性
Mar 19 Javascript
简单实现JS上传图片预览功能
Apr 14 Javascript
JavaScript之Map和Set_动力节点Java学院整理
Jun 29 Javascript
使用JavaScript实现链表的数据结构的代码
Aug 02 Javascript
8个有意思的JavaScript面试题
Jul 30 Javascript
微信小程序 搜索框组件代码实例
Sep 06 Javascript
vue element-ui实现input输入框金额数字添加千分位
Dec 29 Javascript
浅谈React中组件逻辑复用的那些事儿
May 21 Javascript
js实现磁性吸附的示例
Oct 26 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
一键删除顽固的空文件夹 软件下载
2007/01/26 PHP
JS实现php的伪分页
2008/05/25 PHP
一个php Mysql类 可以参考学习熟悉下
2009/06/21 PHP
php数据库密码的找回的步骤
2011/01/12 PHP
一文看懂PHP进程管理器php-fpm
2020/06/01 PHP
跨浏览器开发经验总结(三)   警惕“IE依赖综合症”
2010/05/13 Javascript
修改jquery.lazyload.js实现页面延迟载入
2010/12/22 Javascript
JavaScript阻止事件冒泡示例分享
2014/12/28 Javascript
javascript制作网页图片上实现下雨效果
2015/02/26 Javascript
jquery.validate[.unobtrusive]和Bootstrap实现tooltip错误提示问题分析
2016/10/30 Javascript
JS实现遍历不规则多维数组的方法
2018/03/21 Javascript
详解vue-cli官方脚手架配置
2018/07/20 Javascript
Angular 利用路由跳转到指定页面的指定位置方法
2018/08/31 Javascript
socket在egg中的使用实例代码详解
2019/05/30 Javascript
JS替换字符串中指定位置的字符(多种方法)
2020/05/28 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
Python变量作用范围实例分析
2015/07/07 Python
python控制台中实现进度条功能
2015/11/10 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
python学习开发mock接口
2019/04/28 Python
Python比较配置文件的方法实例详解
2019/06/06 Python
基于python计算并显示日间、星期客流高峰
2020/05/07 Python
Python实现扫码工具的示例代码
2020/10/09 Python
Desigual德国官网:在线购买原创服装
2018/03/27 全球购物
财务会计专业求职信范文
2013/12/31 职场文书
班主任个人工作反思
2014/04/28 职场文书
学雷锋先进个人事迹
2014/05/26 职场文书
家长对孩子的寄语
2015/02/26 职场文书
收入证明怎么写
2015/06/12 职场文书
2016银行招聘自荐信
2016/01/28 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
JavaScript如何利用Promise控制并发请求个数
2021/05/14 Javascript
Spark SQL 2.4.8 操作 Dataframe的两种方式
2021/10/16 SQL Server
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
Python可视化神器pyecharts绘制地理图表
2022/07/07 Python