function format(string) { var args = arguments; var pattern = new RegExp("%([1-" + arguments.length + "])", "g"); return String(string).replace(pattern, function(match, index) { return args[index]; }); };
网上关于arguments的一段代码,不懂红色部分,来看一下array.replace(pattern,function(match,index){}的用法。
当replacement是函数时比较特殊,需要知道对应的参数表示什么。
详见w3scool(http://www.w3school.com.cn/jsref/jsref_replace.asp):
注意:ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数 是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。
如需详细了解replace的参数,运行下这段代码就清楚了。
(function(window){ function fn(str){ this.str=str; } fn.prototype.format = function(){ var arg = arguments; return this.str.replace(/{(d+)}/ig,function(a,b,c,d){ console.log(a); console.log(b); console.log(c); console.log(d); return arg[b]||""; }); }; window.fn = fn; })(window); //use (function(){ var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>'); console.log(t.format('http://www.alibaba.com','Alibaba','Welcome')); })();
讲到可以通过arguments实现不定参数、模拟函数重载,下面给出的code大概就是这个意思了。
function Add(firstnumber,sencondnumber) { if (arguments.length == 0)//没有传递参数 { return null; } else if (arguments.length == 1) {//传递的是一个参数 return firstnumber;//也可以写为 return arguments[0]; } else if(arguments.length == 2)//传递的是两个参数 { return firstnumber+sencondnumber;//也可以写为 return arguments[0]+arguments[1]; } else { var total=0; for (var i = 0; i < arguments.length; i++) { total=total+arguments[i] } return total; } }