javascript下string.format函数补充


Posted in Javascript onAugust 24, 2010

又重新阅读了一遍Andrew的原文,在原文下面的评论中,赫然发现也有人早提出参数个数的问题,同样懒惰的楼猪直接拷贝原文评论答复了一下,同时还发现说漏了很重要的一个注意点Array.prototype.slice。
下面统一补充说明一下:

1、string.format的参数个数
在Andrew的原文中,已经有人指出:

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

这个留言的家伙给足了作者面子,称“I understand it was only an example and brevety is the main objective, but its a great function to have”。原来,原文中定义的正则表达式能够验证的数字范围是...原来如此啊,哈哈,楼猪心虚的笑了。

2、Array.prototype.slice
将arguments转换成Array的方法是通过Array.prototype.slice.call(arguments);方式转换的,也就是说类数组方式的对象都可以通过slice的方式实现到Array的转换,说到类数组对象的转换,真的很有必要重新记录总结一下Array的原型方法slice。
(1)、常见用法
楼猪在早前的这篇里通过一段代码一带而过介绍过slice方法:slice(start,end):返回数组对象的一个子集,索引从start开始(包括 start),到end结束(不包括end),原有数组不受影响。其实我们可以大胆猜测slice函数内部应该是定义了一个数组变量,然后通过循环,将数组对应索引值push进变量,最后return这个Array变量。
(2)、“不是Array,我们也想要变成Array”
不是Array,但是有length属性,可以根据索引取值,比如本文中的arguments,我们可以通过下面的方式转换为真实数组:

function test() { 
var args = Array.prototype.slice.call(arguments); 
alert(args.length); 
args.push("jeff"); //push 
args.push("wong"); 
alert(args.length); //2 
alert(args.pop()); //pop 
alert(args.length); //1 
} 
test();

我们看到push和pop方法都起作用了。同样,Nodelist也有类似特性。怎么样将NodeList转换成Array?看过楼猪原文的读者可能会觉得这都是陈词滥调,还是多说一句,在IE下,Array.prototype.slice.call(nodelist)就不是那么回事了,最后再贴一次将NodeList转换为Array并且兼容ie和其他浏览器的方法结束本文:
var nodelist =something;//一个NodeList变量 
var arr = null; //数组 
try { //ie 
arr = new Array(); 
for (var i = 0; i < nodelist.length; i++) { 
arr.push(nodelist[i]); 
} 
} catch (e) {//其他浏览器 
arr = Array.prototype.slice.call(nodelist); 
}

作者:Jeff Wong
Javascript 相关文章推荐
弹出广告特效代码(一个IP只弹出一次)
May 11 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
Apr 02 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
Jul 17 Javascript
JS自调用匿名函数具体实现
Feb 11 Javascript
node.js中的console.warn方法使用说明
Dec 09 Javascript
整理关于Bootstrap过渡动画的慕课笔记
Mar 29 Javascript
详解vue组件通信的三种方式
Jun 30 Javascript
用Vue-cli搭建的项目中引入css报错的原因分析
Jul 20 Javascript
详解easyui基于 layui.laydate日期扩展组件
Jul 18 Javascript
VUE中使用HTTP库Axios方法详解
Feb 05 Javascript
解决node终端下运行js文件不支持ES6语法
Apr 04 Javascript
vue抽出组件并传值实例
Jul 31 Javascript
javascript下利用arguments实现string.format函数
Aug 24 #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
You might like
DC动画很好看?新作烂得令人发指,名叫《红色之子》
2020/04/09 欧美动漫
PHPWind 发帖回帖Api PHP版打包下载
2010/02/08 PHP
常见的PHP五种设计模式小结
2011/03/23 PHP
thinkPHP+ajax实现统计页面pv浏览量的方法
2017/03/15 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
Javascript常用运算符(Operators)-javascript基础教程
2007/12/14 Javascript
jquery 操作DOM的基本用法分享
2012/04/05 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
JavaScript的事件代理和委托实例分析
2015/03/25 Javascript
JavaScript里四舍五入函数round用法实例
2015/04/06 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
BootStrap的弹出框(Popover)支持鼠标移到弹出层上弹窗层不隐藏的原因及解决办法
2016/04/03 Javascript
vue插件tab选项卡使用小结
2016/10/27 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
JS 调试中常见的报错问题解决方法
2017/05/20 Javascript
JavaScript如何获取到导航条中HTTP信息
2017/10/10 Javascript
用python结合jieba和wordcloud实现词云效果
2017/09/05 Python
python2.7和NLTK安装详细教程
2018/09/19 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
Django REST framework视图的用法
2019/01/16 Python
详解Python3注释知识点
2019/02/19 Python
python批量将excel内容进行翻译写入功能
2019/10/10 Python
Python中__repr__和__str__区别详解
2019/11/07 Python
pytorch中nn.Conv1d的用法详解
2019/12/31 Python
Python迭代器Iterable判断方法解析
2020/03/16 Python
美国棒球装备和用品商店:Baseball Savings
2018/06/09 全球购物
工程力学专业毕业生求职信
2013/10/06 职场文书
普罗米修斯教学反思
2014/02/06 职场文书
仓管岗位职责范本
2014/02/08 职场文书
交通事故私了协议书
2014/04/16 职场文书
人事经理岗位职责
2014/04/28 职场文书
感恩节寄语2015
2015/03/24 职场文书
归途列车观后感
2015/06/17 职场文书
职场新人刚入职工作总结该怎么写?
2019/05/15 职场文书
Django集成富文本编辑器summernote的实现步骤
2021/05/31 Python