因為語言上的設計錯誤,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);
}
這裡arguments的類型是一個對象,雖然數組的類型也是一個對象,雖然我們可以將之轉換為一個數組
復制代碼 代碼如下:
var args = Array.prototype.slice.call(arguments);
但是這也表明了這不是一個數組,它擁有的只有Array的唯一一個屬性,即length。除此還有
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.