實參個數大于形參個數
對于如下函數
function say(name, msg) {
console.log(name);
console.log(msg);
}
這句話的調用結果是什么?
say('1', '2', '3')
對于其他語言,比如 Java,要是這么寫的話,編譯器根本就不會讓你編譯通過,但是在 JS 里是可以運行的。運行結果是
1
2
undefined
實參個數小于形參個數
還是同樣的代碼
function say(name, msg) {
console.log(name + msg);
}
say('1')
打印
1
undefined
如果什么參數都不寫,直接調用
say();
打印
undefined
undefined
結論
從上面的例子可以看出,在 JS 中變量定義的時候,如果不給一個變量賦初值那么該變量的類型為
undefiend
在進行函數調用的時候,不管實參的數目大于形參還是小于形參被調用的函數都會執行;在JS中函數不介意傳遞進來多少個參數,也不在乎傳進來的參數是什么數據類型。發生函數調用的時候可以給一個實參也可以給多個實參。
原理
在 js 中,參數在內部是用一個數組來表示。函數接收到的始終是這個數組,而不關心數組中包含哪些參數,如果這個數組不包含任何參數也無所謂,包含多個參數也沒問題。
在函數體內可以通過 arguments
對象來訪問這個參數數組,從而獲取傳遞給參數的每個參數。
function say(name, msg) {
for(let i = 0; i < arguments.length; i++) {
console.log('arg[' + i + '] = ' + arguments[i]);
}
console.log('length = ' + arguments.length);
}
傳入 3 個參數
say('1', '2', '3');
打印結果
arg[0] = 1
arg[1] = 2
arg[2] = 3
length = 3