因為語言上的設計錯誤,arguments可以被當成一個陣列。
function zero () {
console.log(arguments[0]);
}
也會有
function zero () {
for(var i=0;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.