預設引數

在 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