默认参数
在 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