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 Split方法,indexOf方法、lastIndexOf 方法和substring 方法
Mar 21 Javascript
自己整理的一个javascript日期处理函数
Oct 16 Javascript
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
Jul 17 Javascript
限制textbox或textarea输入字符长度的JS代码
Oct 16 Javascript
jquery实现仿JqueryUi可拖动的DIV实例
Jul 31 Javascript
JS实现的表格操作类详解(添加,删除,排序,上移,下移)
Dec 22 Javascript
JS读取XML文件数据并以table形式显示数据的方法(兼容IE与火狐)
Jun 02 Javascript
VUE使用vuex解决模块间传值问题的方法
Jun 01 Javascript
Node.Js中实现端口重用原理详解
May 03 Javascript
浅谈Webpack 是如何加载模块的
May 24 Javascript
ECharts地图绘制和钻取简易接口详解
Jul 12 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目录操作函数之获取目录与文件的类型
2010/12/29 PHP
PHP学习笔记之二
2011/01/17 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
2013/01/11 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
PHP自定义函数获取汉字首字母的方法
2016/12/01 PHP
浅谈PHP中pack、unpack的详细用法
2018/03/12 PHP
Laravel 已登陆用户再次查看登陆页面的自动跳转设置方法
2019/09/30 PHP
jquery判断浏览器类型的代码
2012/11/05 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
javascript实现根据3原色制作颜色选择器的方法
2015/07/17 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
js无提示关闭浏览器窗口的两种方法分析
2016/11/06 Javascript
微信小程序 ecshop地址三级联动实现实例代码
2017/02/28 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
详解JS中统计函数执行次数与执行时间
2018/09/04 Javascript
Js 利用正则表达式和replace函数获取string中所有被匹配到的文本(推荐)
2018/10/28 Javascript
详解Vue中的Props与Data细微差别
2020/03/02 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
vue3中轻松实现switch功能组件的全过程
2021/01/07 Vue.js
用python 制作图片转pdf工具
2015/01/30 Python
set在python里的含义和用法
2019/06/24 Python
python实现微信自动回复及批量添加好友功能
2019/07/03 Python
Python socket 套接字实现通信详解
2019/08/27 Python
Python 3.6 中使用pdfminer解析pdf文件的实现
2019/09/25 Python
python tornado修改log输出方式
2019/11/18 Python
keras 指定程序在某块卡上训练实例
2020/06/22 Python
南威尔士家居商店:Leekes
2016/10/25 全球购物
Marlies Dekkers内衣美国官方网上商店:高端内衣品牌
2018/11/12 全球购物
Hunkemöller瑞士网上商店:欧洲最大的内衣品牌之一
2018/12/03 全球购物
职业生涯规划书的格式
2013/12/29 职场文书
回门宴父母答谢词
2014/01/26 职场文书
2015秋学期开学寄语
2015/05/28 职场文书
2015中学教学工作总结
2015/07/22 职场文书
全民创业工作总结
2015/08/13 职场文书
ORM模型框架操作mysql数据库的方法
2021/07/25 MySQL
SpringBoot整合Minio文件存储
2022/04/03 Java/Android