Standard-Parameterwerte
Mit ES6 können Sie eines der vielleicht häufigsten Idiome in JavaScript
bezieht sich auf die Festlegung eines Standardwertes für einen Funktionsparameter. Die Art und Weise, wie wir dies seit Jahren tun, sollte uns recht vertraut vorkommen:
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
Dieses Muster wird am häufigsten verwendet, ist aber gefährlich, wenn wir Werte wie
foo(0, 42)
foo( 0, 42 ); // 53 <-- Oops, not 42
Warum? Weil die 0 is falsy
und damit die x || 11 results in 11
und nicht die direkt übergebene 0. Um diesen Fehler zu beheben, werden manche Leute die Prüfung ausführlicher schreiben, etwa so:
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
können wir nun eine nette, hilfreiche Syntax untersuchen, die ab dem ES6
um die Zuweisung von Standardwerten für fehlende Argumente zu rationalisieren:
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
in einer Funktionsdeklaration ist eher wie x !== undefined ? x : 11
als die weitaus üblichere Redewendung x || 11
Standardwertausdrücke
Function
Standardwerte können mehr als nur einfache Werte wie 31 sein; sie können jeder gültige Ausdruck sein, sogar ein 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
Wie Sie sehen, werden die Standardwertausdrücke nur langsam ausgewertet, d. h. sie werden nur ausgeführt, wenn sie benötigt werden, d. h. wenn das Argument eines Parameters weggelassen wird oder undefiniert ist.
Ein Standardwertausdruck kann sogar ein Inline-Funktionsausdruck sein, der gemeinhin als sofort aufgerufener Funktionsausdruck (Immediately Invoked Function Expression) bezeichnet wird. (IIFE)
:
function foo( x =
(function(v){ return v + 11; })( 31 )
) {
console.log( x );
}
foo(); // 42