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 相关文章推荐
fireworks菜单生成器mm_menu.js在 IE 7.0 显示问题的解决方法
Oct 20 Javascript
无缝滚动改进版支持上下左右滚动(封装成函数)
Dec 04 Javascript
JavaScript函数的一些注意要点小结及js匿名函数
Nov 10 Javascript
JavaScript鼠标事件,点击鼠标右键,弹出div的简单实例
Aug 03 Javascript
微信js-sdk地理位置接口用法示例
Oct 12 Javascript
JavaScript基于Dom操作实现查找、修改HTML元素的内容及属性的方法
Jan 20 Javascript
vue中用动态组件实现选项卡切换效果
Mar 25 Javascript
jQuery中内容过滤器简单用法示例
Mar 31 jQuery
vue2.0 移动端实现下拉刷新和上拉加载更多的示例
Apr 23 Javascript
vue拖拽排序插件vuedraggable使用方法详解
Aug 21 Javascript
VUE DEMO之模拟登录个人中心页面之间数据传值实例
Oct 31 Javascript
jQuery实现影院选座订座效果
Apr 13 jQuery
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
re0第二季蕾姆被制作组打入冷宫!艾米莉亚女主扶正,原因唏嘘
2020/04/02 日漫
PHP生成带有雪花背景的验证码
2006/10/09 PHP
Zend studio文件注释模板设置方法
2013/09/29 PHP
ThinkPHP行为扩展Behavior应用实例详解
2014/07/22 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
php封装的图片(缩略图)处理类完整实例
2016/10/19 PHP
magento后台无法登录解决办法的两种方法
2016/12/09 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
基于Vue实现timepicker
2017/04/25 Javascript
详解如何在Vue里建立长按指令
2018/08/20 Javascript
vue router的基本使用和配置教程
2018/11/05 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
vue2 拖动排序 vuedraggable组件的实现
2019/08/08 Javascript
VSCode搭建React Native环境
2020/05/07 Javascript
element-ui 实现响应式导航栏的示例代码
2020/05/08 Javascript
[01:01:14]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第一场 11.21
2020/11/23 DOTA
在Python中使用itertools模块中的组合函数的教程
2015/04/13 Python
DJANGO-URL反向解析REVERSE实例讲解
2019/10/25 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
python对execl 处理操作代码
2020/06/22 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
10张动图学会python循环与递归问题
2021/02/06 Python
HTML5 Canvas实现烟花绽放特效
2016/03/02 HTML / CSS
某IT外企面试题-二分法求方程!看看大家的C++功底
2015/07/04 面试题
PPP协议组成及简述协议协商的基本过程
2015/05/28 面试题
校园招聘策划书
2014/01/09 职场文书
党员公开承诺书和承诺事项
2014/03/25 职场文书
理想点亮人生演讲稿
2014/05/21 职场文书
应用外语系自荐信
2014/06/26 职场文书
2016高考感言
2015/08/01 职场文书
交通安全教育主题班会
2015/08/12 职场文书
2016年教师师德师风心得体会
2016/01/12 职场文书
MySQL下使用Inplace和Online方式创建索引的教程
2021/05/26 MySQL
Python爬虫基础初探selenium
2021/05/31 Python
Python必备技巧之函数的使用详解
2022/04/04 Python
Golang 实现WebSockets
2022/04/24 Golang