Ninguém mencionou aqui o potencial para NaN
, que - para mim - também é um valor nulo. Então, pensei em adicionar meus dois centavos.
Para o código fornecido:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Se você usar o ||
operador, obterá o primeiro valor não falso:
var result = a || b || c || d || e || f; // result === 1
Se você usar o método típico de coalescência, conforme publicado aqui , obterá c
o valor:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Nenhuma dessas parece correta para mim. No meu pequeno mundo de lógica de coalescência, que pode diferir do seu mundo, considero indefinido, nulo e NaN como sendo todos "nulos". Então, eu esperaria voltar d
(zero) do método de coalescência.
Se o cérebro de alguém funcionar como o meu e você quiser excluir NaN
, esse método fará isso:
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 aqueles que desejam o código o mais curto possível e não se importam com a falta de clareza, também é possível usá-lo conforme sugerido pelo @impinball. Isso tira proveito do fato de que NaN nunca é igual a NaN. Você pode ler mais sobre isso aqui: Por que NaN não é 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
sintaxe está agora no status da proposta do estágio 1 - coalescência