Значения параметров по умолчанию
С ES6 вы можете сделать, возможно, один из самых распространенных идиом в JavaScript
, связанный с установкой значения по умолчанию для параметра функции. То, как мы это делали годами, должно выглядеть довольно знакомо:
function foo(x,y) {
x = x || 11;
y = y || 31;
console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 5 ); // 36
foo( null, 6 ); // 17
Этот шаблон наиболее часто используется, но он опасен, когда мы передаем значения типа
foo(0, 42)
foo( 0, 42 ); // 53 <-- Oops, not 42
Почему? Потому что 0 is falsy
, а значит x || 11 results in 11
, а не непосредственно переданный в 0. Чтобы исправить эту ошибку, некоторые люди вместо этого напишут чек более подробно так:
function foo(x,y) {
x = (x !== undefined) ? x : 11;
y = (y !== undefined) ? y : 31;
console.log( x + y );
}
foo( 0, 42 ); // 42
foo( undefined, 6 ); // 17
теперь мы можем рассмотреть хороший полезный синтаксис, добавленный с ES6
, чтобы упростить назначение значений по умолчанию отсутствующим аргументам:
function foo(x = 11, y = 31) {
console.log( x + y );
}
foo(); // 42
foo( 5, 6 ); // 11
foo( 0, 42 ); // 42
foo( 5 ); // 36
foo( 5, undefined ); // 36 <-- `undefined` is missing
foo( 5, null ); // 5 <-- null coerces to `0`
foo( undefined, 6 ); // 17 <-- `undefined` is missing
foo( null, 6 ); // 6 <-- null coerces to `0`
x = 11
в объявлении функции больше похоже на x !== undefined ? x : 11
, чем гораздо более распространенная идиома x || 11
Выражения значений по умолчанию
Function
значения по умолчанию могут быть не просто простыми значениями, такими как 31; они могут быть любым допустимым выражением, даже function call
:
function bar(val) {
console.log( "bar called!" );
return y + val;
}
function foo(x = y + 3, z = bar( x )) {
console.log( x, z );
}
var y = 5;
foo(); // "bar called"
// 8 13
foo( 10 ); // "bar called"
// 10 15
y = 6;
foo( undefined, 10 ); // 9 10
Как видите, выражения значений по умолчанию лениво вычисляются, то есть они запускаются только тогда и тогда, когда они необходимы, то есть, когда аргумент параметра опущен или не определен.
Выражением значения по умолчанию может быть даже вызов встроенного выражения функции, обычно называемый выражением немедленного вызова функции (IIFE)
:
function foo( x =
(function(v){ return v + 11; })( 31 )
) {
console.log( x );
}
foo(); // 42