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 组件之旅(二)编码实现和算法
Oct 28 Javascript
在JQuery dialog里的服务器控件 事件失效问题
Dec 08 Javascript
jquery jqPlot API 中文使用教程(非常强大的图表工具)
Aug 15 Javascript
web css实现整站样式互相切换
Oct 29 Javascript
jquery弹出层类代码分享
Dec 27 Javascript
简易的投票系统以及js刷票思路和方法
Apr 07 Javascript
原生JS实现旋转木马式图片轮播插件
Apr 25 Javascript
JS作用域闭包、预解释和this关键字综合实例解析
Dec 16 Javascript
javascript字体颜色控件的开发 JS实现字体控制
Nov 27 Javascript
jQuery滚动条美化插件nicescroll简单用法示例
Apr 18 jQuery
js对象简介与基本用法示例
Mar 13 Javascript
vue中jsonp插件的使用方法示例
Sep 10 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实现与ASP Banner组件相似的类
2006/10/09 PHP
php中看实例学正则表达式
2006/12/25 PHP
介绍几个array库的新函数 php
2006/12/29 PHP
PHP按符号截取字符串的指定部分的实现方法
2018/09/10 PHP
laravel入门知识点整理
2020/09/15 PHP
基于JavaScript 下namespace 功能的简单分析
2013/07/05 Javascript
JS获取单击按钮单元格所在行的信息
2014/06/17 Javascript
JS获取图片高度宽度的方法分享
2015/04/17 Javascript
全面解析Bootstrap表单使用方法(表单按钮)
2015/11/24 Javascript
jquery遍历函数siblings()用法实例
2015/12/24 Javascript
jQuery Validation Plugin验证插件手动验证
2016/01/26 Javascript
javascript实现可键盘控制的抽奖系统
2016/03/10 Javascript
Javascript的表单验证-提交表单
2016/03/18 Javascript
30分钟快速掌握Bootstrap框架
2016/05/24 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
24行JavaScript代码实现Redux的方法实例
2019/11/17 Javascript
Python字符串和文件操作常用函数分析
2015/04/08 Python
Python实现建立SSH连接的方法
2015/06/03 Python
Python 正则表达式实现计算器功能
2017/04/29 Python
Python实现读写sqlite3数据库并将统计数据写入Excel的方法示例
2017/08/07 Python
pytorch构建网络模型的4种方法
2018/04/13 Python
python 显示数组全部元素的方法
2018/04/19 Python
python 获取utc时间转化为本地时间的方法
2018/12/31 Python
解决Python找不到ssl模块问题 No module named _ssl的方法
2019/04/29 Python
python能做什么 python的含义
2019/10/12 Python
Python bisect模块原理及常见实例
2020/06/17 Python
python切割图片的示例
2020/11/12 Python
python 利用panda 实现列联表(交叉表)
2021/02/06 Python
个人投资计划书
2014/05/01 职场文书
后备干部培训方案
2014/05/22 职场文书
家长会标语
2014/06/24 职场文书
《秋思》教学反思
2016/02/23 职场文书
MySQL修炼之联结与集合浅析
2021/10/05 MySQL
Java实现给Word文件添加文字水印
2022/02/15 Java/Android