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 相关文章推荐
js 禁用浏览器的后退功能的简单方法
Dec 10 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
浅谈javascript中字符串String与数组Array
Dec 31 Javascript
JavaScript实现当网页加载完成后执行指定函数的方法
Mar 21 Javascript
Bootstrap每天必学之警告框插件
Apr 26 Javascript
分享10个优化代码的CSS和JavaScript工具
May 11 Javascript
动态的9*9乘法表效果的实现代码
May 16 Javascript
jQuery提示插件qTip2用法分析(支持ajax及多种样式)
Jun 08 Javascript
BootStrap modal模态弹窗使用小结
Oct 26 Javascript
jQuery插件zTree实现获取当前选中节点在同级节点中序号的方法
Mar 08 Javascript
一文读懂ES7中的javascript修饰器
May 06 Javascript
浅谈在vue-cli3项目中解决动态引入图片img404的问题
Aug 04 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学习之PHP表达式
2006/10/09 PHP
用 PHP5 轻松解析 XML
2006/12/04 PHP
PHP APC的安装与使用详解
2013/06/13 PHP
PHP实现邮件群发的源码
2013/06/18 PHP
php实现Mysql简易操作类
2015/10/11 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
js资料prototype 属性
2007/03/13 Javascript
jQuery select的操作实现代码
2009/05/06 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
常用的JavaScript验证正则表达式汇总
2013/11/26 Javascript
使用jQuery将多条数据插入模态框的实现代码
2014/10/08 Javascript
jQuery事件绑定与解除绑定实现方法
2015/04/15 Javascript
究竟什么是Node.js?Node.js有什么好处?
2015/05/29 Javascript
jQuery选择器总结之常用元素查找方法
2016/08/04 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
Bootstrap源码解读表单(2)
2016/12/22 Javascript
js控制按钮,防止频繁点击响应的实例
2017/02/15 Javascript
NodeJS模块与ES6模块系统语法及注意点详解
2019/01/04 NodeJs
解决layer.confirm快速点击会重复触发事件的问题
2019/09/23 Javascript
vue-router 路由传参用法实例分析
2020/03/06 Javascript
Python中import机制详解
2017/11/14 Python
flask框架中勾子函数的使用详解
2018/08/01 Python
使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤
2018/12/17 Python
Python英文文章词频统计(14份剑桥真题词频统计)
2019/10/13 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
Python3.5 win10环境下导入kera/tensorflow报错的解决方法
2019/12/19 Python
VSCode中autopep8无法运行问题解决方案(提示Error: Command failed,usage)
2021/03/02 Python
全球最大的生存食品、水和装备专用在线市场:BePrepared.com
2020/01/02 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
可贵的沉默教学反思
2014/02/06 职场文书
2014年信息宣传工作总结
2014/12/18 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书
青春雷锋观后感
2015/06/10 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL