建議56:使用arguments模拟重載
在JavaScript中,每個函數内部可以使用arguments對象,該對象包含了函數被調用時的實際參數值。arguments對象雖然在功能上與數組有些類似,但它不是數組。 arguments 對象與數組的類似展現在它有一個 length 屬性,同時實際參數的值可以通過[]操作符來擷取,但arguments對象并沒有數組可以使用的push、pop、splice等方法。其原因是arguments對象的prototype指向的是Object.prototype,而不是Array.prototype。
Java和C++語言都支援方法重載,即允許出現名稱相同而形式參數不同的方法,但JavaScript并不支援這種方式的重載。這是因為JavaScript中的function對象也是以屬性的形式出現的,在一個對象中增加與已有function 同名的新function時,舊的function對象會被覆寫。不過可以通過使用arguments來模拟重載,其實作機制是通過判斷arguments中實際參數的個數和類型來執行不同的邏輯。
function sayHello() {
}
sayHello(); //"Hello"
sayHello("Alex"); // "Hello, Alex"
sayHello("Alex", "cn"); // " 你好,Alex"
callee是arguments對象的一個屬性,其值是目前正在執行的function對象。它的作用是使匿名 function可以被遞歸調用。下面以一段計算斐波那契序列中第N個數的值的過程來示範arguments.callee的使用。
function fibonacci(num) {
fibonacci(100);