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 相关文章推荐
基于jquery的无缝循环新闻列表插件
Mar 07 Javascript
原生js实现shift/ctrl/alt按键的获取
Apr 08 Javascript
js去除输入框中所有的空格和禁止输入空格的方法
Jun 09 Javascript
AngularJS 工作原理详解
Aug 18 Javascript
AngularJS ng-template寄宿方式用法分析
Nov 07 Javascript
JS实现JSON.stringify的实例代码讲解
Feb 07 Javascript
使用nvm管理不同版本的node与npm的方法
Oct 31 Javascript
详解使用vue-admin-template的优化历程
May 20 Javascript
JS+HTML5实现获取手机验证码倒计时按钮
Aug 08 Javascript
react 移动端实现列表左滑删除的示例代码
Jul 04 Javascript
js实现小球在页面规定的区域运动
Jun 16 Javascript
详谈Object.defineProperty 及实现数据双向绑定
Jul 18 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
如何使用jQuery+PHP+MySQL来实现一个在线测试项目
2015/04/26 PHP
PHP实现的折半查找算法示例
2017/12/19 PHP
PHP双向链表定义与用法示例
2018/01/31 PHP
JS 统计时间
2021/03/09 Javascript
JavaScript 编程引入命名空间的方法
2007/06/29 Javascript
新发现一个骗链接的方法(js读取cookies)
2012/01/11 Javascript
Ext JS 4实现带week(星期)的日期选择控件(实战二)
2013/08/21 Javascript
判定是否原生方法的JS代码
2013/11/12 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
跟我学习javascript的全局变量
2015/11/16 Javascript
js密码强度检测
2016/01/07 Javascript
JavaScript中日期函数的相关操作知识
2016/08/03 Javascript
JS获取IE版本号与HTML设置IE文档模式的方法
2016/10/09 Javascript
js 单引号替换成双引号,双引号替换成单引号的实现方法
2017/02/16 Javascript
AngularJS之页面跳转Route实例代码
2017/03/10 Javascript
详解Vue中状态管理Vuex
2017/05/11 Javascript
解决Jquery下拉框数据动态获取的问题
2018/01/25 jQuery
JavaScript实现数组全排列、去重及求最大值算法示例
2018/07/30 Javascript
vue-cli 使用vue-bus来全局控制的实例讲解
2018/09/15 Javascript
Vue.js 实现地址管理页面思路详解(地址添加、编辑、删除和设置默认地址)
2019/12/11 Javascript
Node.js fs模块原理及常见用途
2020/10/22 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
下载糗事百科的内容_python版
2008/12/07 Python
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
python基于物品协同过滤算法实现代码
2018/05/31 Python
[原创]Python入门教程1. 基本运算【四则运算、变量、math模块等】
2018/10/28 Python
python异常处理try except过程解析
2020/02/03 Python
Python3.6 中的pyinstaller安装和使用教程
2020/03/16 Python
详解Python模块化编程与装饰器
2021/01/16 Python
使用CSS3编写类似iOS中的复选框及带开关的按钮
2016/04/11 HTML / CSS
教师考察材料范文
2014/06/03 职场文书
2015年度物业公司工作总结
2015/04/27 职场文书
公司捐书倡议书
2015/04/27 职场文书
社区环境卫生倡议书
2015/04/29 职场文书
2015年党风廉政建设个人总结
2015/08/18 职场文书
《青山不老》教学反思
2016/02/22 职场文书