arguments对象----不定参数的实现方式

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;
}

}
原文地址:https://www.cnblogs.com/web-coding/p/4712279.html