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(视频与PPT)
Dec 27 Javascript
Javascript 自定义类型方法小结
Mar 02 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
Nov 25 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
May 09 Javascript
Angular.Js的自动化测试详解
Dec 09 Javascript
JQuery判断正整数整理小结
Aug 21 jQuery
Vue2仿淘宝实现省市区三级联动
Apr 15 Javascript
webuploader实现上传图片到服务器功能
Aug 16 Javascript
vue多层嵌套路由实例分析
Mar 19 Javascript
Vue.js递归组件实现组织架构树和选人功能案例分析
Jul 03 Javascript
laravel实现中文和英语互相切换的例子
Sep 30 Javascript
webpack HappyPack实战详解
Oct 08 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的HTTP请求的库Requests实现美女图片墙
2015/02/22 PHP
session 加入redis的实现代码
2016/07/15 PHP
PHP入门教程之图像处理技巧分析
2016/09/11 PHP
GWT中复制到剪贴板 js+flash实现复制 兼容性比较好
2010/03/07 Javascript
open 动态修改img的onclick事件示例代码
2013/11/13 Javascript
js焦点文字滚动效果代码分享
2015/08/25 Javascript
js判断文本框输入的内容是否为数字
2015/12/23 Javascript
JS上传组件FileUpload自定义模板的使用方法
2016/05/10 Javascript
Angular ui.bootstrap.pagination分页
2017/01/20 Javascript
从零开始学习Node.js系列教程五:服务器监听方法示例
2017/04/13 Javascript
安装vue-cli报错 -4058 的解决方法
2017/10/19 Javascript
浅谈webpack 自动刷新与解析
2018/04/09 Javascript
Koa2微信公众号开发之消息管理
2018/05/16 Javascript
webpack+vue-cil中proxyTable处理跨域的方法
2018/07/20 Javascript
nodejs aes 加解密实例
2018/10/10 NodeJs
Vue一个案例引发的递归组件的使用详解
2018/11/15 Javascript
JS实现二维数组元素的排列组合运算简单示例
2019/01/28 Javascript
浅谈Node 异步IO和事件循环
2019/05/05 Javascript
vue 动态组件用法示例小结
2020/03/06 Javascript
ES6字符串的扩展实例
2020/12/21 Javascript
[03:53]2016国际邀请赛中国区预选赛第三日TOP10精彩集锦
2016/06/29 DOTA
python构建深度神经网络(DNN)
2018/03/10 Python
django使用xadmin的全局配置详解
2019/11/15 Python
结束运行python的方法
2020/06/16 Python
详解CSS3阴影 box-shadow的使用和技巧总结
2016/12/03 HTML / CSS
Crucial英睿达法国官网:内存条及SSD固态硬盘升级
2018/07/13 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
医药学专业大学生职业生涯规划书论文
2014/01/21 职场文书
创建文明学校实施方案
2014/03/11 职场文书
单方离婚协议书范本2014
2014/10/28 职场文书
装饰施工员岗位职责
2015/04/11 职场文书
道士塔读书笔记
2015/06/30 职场文书
2015年六年级班主任工作总结
2015/10/15 职场文书
三好学生主要事迹材料
2015/11/03 职场文书
2016年小学端午节活动总结
2016/04/01 职场文书
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB