預設引數
在 ECMAScript 2015(ES6)
之前,可以通過以下方式分配引數的預設值:
function printMsg(msg) {
msg = typeof msg !== 'undefined' ? // if a value was provided
msg : // then, use that value in the reassignemnt
'Default value for msg.'; // else, assign a default value
console.log(msg);
}
ES6 提供了一種新語法,其中不再需要上述條件和重新分配:
Version >= 6
function printMsg(msg='Default value for msg.') {
console.log(msg);
}
printMsg(); // -> "Default value for msg."
printMsg(undefined); // -> "Default value for msg."
printMsg('Now my msg in different!'); // -> "Now my msg in different!"
這也表明,如果在呼叫函式時缺少引數,則其值保持為 undefined
,因為可以通過在以下示例中顯式提供它來確認(使用箭頭函式 ):
Version >= 6
let param_check = (p = 'str') => console.log(p + ' is of type: ' + typeof p);
param_check(); // -> "str is of type: string"
param_check(undefined); // -> "str is of type: string"
param_check(1); // -> "1 is of type: number"
param_check(this); // -> "[object Window] is of type: object"
函式/變數作為預設值和重用引數
預設引數的值不限於數字,字串或簡單物件。一個函式也可以設定為預設值 callback =
function(){}
:
Version >= 6
function foo(callback = function(){ console.log('default'); }) {
callback();
}
foo(function (){
console.log('custom');
});
// custom
foo();
//default
可以通過預設值執行某些操作特徵:
- 先前宣告的引數可以重用作即將到來的引數值的預設值。
- 在為引數指定預設值時,允許內聯操作。
- 存在於宣告的函式的相同範圍內的變數可以在其預設值中使用。
- 可以呼叫函式以將其返回值提供為預設值。
Version >= 6
let zero = 0;
function multiply(x) { return x * 2;}
function add(a = 1 + zero, b = a, c = b + a, d = multiply(c)) {
console.log((a + b + c), d);
}
add(1); // 4, 4
add(3); // 12, 12
add(2, 7); // 18, 18
add(1, 2, 5); // 8, 10
add(1, 2, 5, 10); // 8, 20
在新呼叫的預設值中重用函式的返回值:
Version >= 6
let array = [1]; // meaningless: this will be overshadowed in the function's scope
function add(value, array = []) {
array.push(value);
return array;
}
add(5); // [5]
add(6); // [6], not [5, 6]
add(6, add(5)); // [5, 6]
當呼叫中缺少引數時,arguments
的值和長度
所述 arguments
陣列物件只保留其值不是預設的引數,即那些在呼叫函式時被顯式提供:
Version >= 6
function foo(a = 1, b = a + 1) {
console.info(arguments.length, arguments);
console.log(a,b);
}
foo(); // info: 0 >> [] | log: 1, 2
foo(4); // info: 1 >> [4] | log: 4, 5
foo(5, 6); // info: 2 >> [5, 6] | log: 5, 6