因为语言上的设计错误,arguments可以被当成一个数组。
function zero () { console.log(arguments[0]); }
function zero () { for(var i=0;i<arguments.length;i++){ console.log(arguments[i]); } }
它利用了Javascript的一个事实,即Javasc
而这里的arguments变量给实参提供了一个类似数组的接口。因为这里的arguments的可变参数,我们可以利用这个有意思的东西来做一些有意思的事,比如重载。
Javscript 重载
stackvoerflow上有一个关于重载的问题,于是有了第一个答案
if (typeof friend === "undefined") {} else {
}
还有一个答案则是
switch (arguments.length) { case 0: //Probably error break; case 1: //Do something break; case 2: default: //Fall through to handle case of more parameters //Do something else break; }
只是这种方式真的不好看,难道我们的函数最后要变成这样子的?
function zero1 (){ console.log('arguments 1') }; function zero2 (){ console.log('arguments 2') }; function zero () { if(arguments.length == 1){ zero1(); } else{ zero2(); } }
真的一点都不好看,即使我们换个switch..case,也不好看啊。
Javascript arguments不是一个数组
arguments不是向我们看到的那样一直是一个数组,有时候可能不是。
function hello(){ console.log(typeof arguments); }
var args = Array.prototype.slice.call(arguments);
arguments.callee
Reference to the currently executing function.
arguments.caller
Reference to the function that invoked the currently executing function.
arguments.length
Reference to the number of arguments passed to the function.