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有关的小细节
Apr 02 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
Aug 01 Javascript
jquery选择器原理介绍($()使用方法)
Mar 25 Javascript
javascript瀑布流式图片懒加载实例解析与优化
Feb 23 Javascript
详解JS中的立即执行函数
Feb 24 Javascript
浅谈js使用in和hasOwnProperty获取对象属性的区别
Apr 27 Javascript
js模块加载方式浅析
Aug 12 Javascript
在vue中使用v-bind:class的选项卡方法
Sep 27 Javascript
react native 原生模块桥接的简单说明小结
Feb 26 Javascript
node.js使用zlib模块进行数据压缩和解压操作示例
Feb 12 Javascript
es6中let和const的使用方法详解
Feb 24 Javascript
如何通过Proxy实现JSBridge模块化封装
Oct 22 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结合JQueryJcrop实现图片裁切实例详解
2014/07/24 PHP
php用户注册时常用的检验函数实例总结
2014/12/22 PHP
php调用KyotoTycoon简单实例
2015/04/02 PHP
基于Jquery的简单&amp;简陋Tabs插件代码
2010/02/09 Javascript
基于jquery的图片轮播 tab切换组件
2012/07/19 Javascript
浅谈javascript的原型继承
2012/07/25 Javascript
js插件方式打开pdf文件(浏览器pdf插件分享)
2013/12/20 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
JavaScript 数组some()和filter()的用法及区别
2016/05/20 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
AngularJs 动态加载模块和依赖
2016/09/15 Javascript
AngularJS框架中的双向数据绑定机制详解【减少需要重复的开发代码量】
2017/01/19 Javascript
Js自动截取字符串长度,添加省略号(……)的实现方法
2017/03/06 Javascript
ES5学习教程之Array对象
2017/04/01 Javascript
JavaScript 巧学巧用
2017/05/23 Javascript
Vue 组件传值几种常用方法【总结】
2018/05/28 Javascript
vue中rem的配置的方法示例
2018/08/30 Javascript
使用Javascript简单计算器
2018/11/17 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
Vue跨域请求问题解决方案过程解析
2020/08/07 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
Python入门篇之数字
2014/10/20 Python
Python xlrd读取excel日期类型的2种方法
2015/04/28 Python
Python+pandas计算数据相关系数的实例
2018/07/03 Python
python 实现UTC时间加减的方法
2018/12/31 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
将python文件打包exe独立运行程序方法详解
2020/02/12 Python
PHP中如何创建和修改数组
2012/05/02 面试题
高校教师思想汇报
2014/01/11 职场文书
表彰先进的通报
2014/01/31 职场文书
车辆年检委托书范本
2014/10/14 职场文书
2016学习依法治国心得体会
2016/01/15 职场文书
AJAX学习笔记
2021/05/18 Javascript
vue+springboot实现登录验证码
2021/05/27 Vue.js
简单聊聊Golang中defer预计算参数
2022/03/25 Golang