Nessuno ha menzionato qui il potenziale per NaN
, che - per me - è anche un valore nullo. Quindi, ho pensato di aggiungere i miei due centesimi.
Per il codice dato:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Se dovessi usare l' ||
operatore, otterrai il primo valore non falso:
var result = a || b || c || d || e || f; // result === 1
Se usi il tipico metodo di coalescenza, come pubblicato qui , otterrai c
, che ha il valore:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Nessuno di questi mi sembra giusto. Nel mio piccolo mondo di logica di coesione, che può differire dal tuo mondo, considero indefiniti, null e NaN come tutti "null-ish". Quindi, mi aspetterei di tornare d
(zero) dal metodo di coalescenza.
Se il cervello di qualcuno funziona come il mio e si desidera escludere NaN
, questo metodo consentirà di:
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;
}
Per coloro che desiderano che il codice sia il più breve possibile e non dispiaccia un po 'di chiarezza, è possibile utilizzare anche questo come suggerito da @impinball. Questo sfrutta il fatto che NaN non è mai uguale a NaN. Puoi saperne di più qui: Perché NaN non è uguale a 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
sintassi è ora nello stato della proposta della fase 1 - coalescenza