默认参数

在 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