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 相关文章推荐
javascript 快速排序函数代码
May 30 Javascript
js 火狐下取本地路径实现思路
Apr 02 Javascript
在页面加载完成后通过jquery给多个span赋值
May 21 Javascript
jquery实现点击label的同时触发文本框点击事件的方法
Jun 05 Javascript
javascript insertAfter()定义与用法示例
Jul 25 Javascript
JS遍历页面所有对象属性及实现方法
Aug 01 Javascript
发布一款npm包帮助理解npm的使用
Jan 03 Javascript
React性能优化系列之减少props改变的实现方法
Jan 17 Javascript
element-ui 远程搜索组件el-select在项目中组件化的实现代码
Dec 04 Javascript
js 获取本周、上周、本月、上月、本季度、上季度的开始结束日期
Feb 01 Javascript
js模拟实现百度搜索
Jun 28 Javascript
JS实现简单贪吃蛇小游戏
Oct 28 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
php实现水仙花数示例分享
2014/04/03 PHP
PHP使用ffmpeg给视频增加字幕显示的方法
2015/03/12 PHP
PHP处理Ajax请求与Ajax跨域问题
2017/02/13 PHP
[原创]php正则删除html代码中class样式属性的方法
2017/05/24 PHP
CSS JavaScript 实现菜单功能 改进版
2008/12/09 Javascript
判断目标是否是window,document,和拥有tagName的Element的代码
2010/05/31 Javascript
javascript模拟select,jselect的方法实现
2012/11/08 Javascript
JQuery基础语法小结
2015/02/27 Javascript
jQuery实现的指纹扫描效果实例(附演示与demo源码下载)
2016/01/26 Javascript
Node.js中JavaScript操作MySQL的常用方法整理
2016/03/01 Javascript
解析利用javascript如何判断一个数为素数
2016/12/08 Javascript
详解Angular.js数据绑定时自动转义html标签及内容
2017/03/30 Javascript
JS jQuery使用正则表达式去空字符的简单实现代码
2017/05/20 jQuery
vue脚手架vue-cli的学习使用教程
2017/06/06 Javascript
Node.js命令行/批处理中如何更改Linux用户密码浅析
2018/07/22 Javascript
vue总线机制(bus)知识点详解
2020/05/10 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
Python脚本实现下载合并SAE日志
2015/02/10 Python
tensorflow实现对图片的读取的示例代码
2018/02/12 Python
python实现二维插值的三维显示
2018/12/17 Python
Flask教程之重定向与错误处理实例分析
2019/08/01 Python
python多进程并行代码实例
2019/09/30 Python
Python单例模式的四种创建方式实例解析
2020/03/04 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
2020/04/10 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
CSS3实现线性渐变用法示例代码详解
2020/08/07 HTML / CSS
成龙霸王洗发水广告词
2014/03/14 职场文书
企业党员公开承诺书
2014/03/26 职场文书
初中三好学生自我鉴定
2014/04/07 职场文书
2014年组织部工作总结
2014/11/14 职场文书
倡议书作文
2015/01/19 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
个人工作保证书
2015/02/28 职场文书
社会心理学学习心得体会
2016/01/22 职场文书
pytorch 两个GPU同时训练的解决方案
2021/06/01 Python