Nadie ha mencionado aquí el potencial NaN
que, para mí, también es un valor nulo. Entonces, pensé que agregaría mis dos centavos.
Para el código dado:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Si usara el ||
operador, obtendrá el primer valor no falso:
var result = a || b || c || d || e || f; // result === 1
Si usa el método de fusión típico, como se publica aquí , obtendrá c
, que tiene el valor:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Ninguno de estos me parece correcto. En mi pequeño mundo de lógica de fusión, que puede diferir de su mundo, considero que indefinido, nulo y NaN son "nulos". Entonces, esperaría volver d
(cero) del método de fusión.
Si el cerebro de alguien funciona como el mío, y desea excluirlo NaN
, entonces este método logrará eso:
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;
}
Para aquellos que desean el código lo más breve posible, y no les importa un poco la falta de claridad, también pueden usar esto como lo sugiere @impinball. Esto aprovecha el hecho de que NaN nunca es igual a NaN. Puede leer más sobre eso aquí: ¿Por qué NaN no es igual 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
sintaxis ahora está en el estado de propuesta de la etapa 1 - fusión conjunta nula