Niemand hat hier das Potenzial für erwähnt NaN
, das für mich auch ein Nullwert ist. Also dachte ich, ich würde meine zwei Cent hinzufügen.
Für den angegebenen Code:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Wenn Sie den ||
Operator verwenden, erhalten Sie den ersten nicht falschen Wert:
var result = a || b || c || d || e || f; // result === 1
Wenn Sie die typische coalesce Methode verwenden, wie hier aufgelistet , die Sie erhalten c
, was den Wert hat:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Beides scheint mir nicht richtig zu sein. In meiner eigenen kleinen Welt der Koaleszenzlogik, die sich von Ihrer Welt unterscheiden kann, betrachte ich undefiniert, null und NaN als alles "null-ish". Ich würde also erwarten, d
von der Koaleszenzmethode zurück zu kommen (Null).
Wenn jemandes Gehirn wie meins funktioniert und Sie es ausschließen möchten NaN
, wird diese Methode Folgendes erreichen:
function coalesce() {
var i, undefined, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg !== null && arg !== undefined
&& (typeof arg !== 'number' || arg.toString() !== 'NaN') ) {
return arg;
}
}
return null;
}
Für diejenigen, die den Code so kurz wie möglich halten möchten und sich nicht um ein wenig Unklarheit kümmern möchten, können Sie diesen auch verwenden, wie von @impinball vorgeschlagen. Dies nutzt die Tatsache aus, dass NaN niemals gleich NaN ist. Mehr dazu lesen Sie hier: Warum ist NaN nicht gleich NaN?
function coalesce() {
var i, arg;
for( i=0; i < arguments.length; i++ ) {
arg = arguments[i];
if( arg != null && arg === arg ) { //arg === arg is false for NaN
return arg;
}
}
return null;
}
x ?? y
Syntax befindet sich jetzt im Status des Vorschlags der Stufe 1 - nullish coalescing