Nikt tu nie wspomniał o potencjale NaN
, który - dla mnie - jest również wartością zerową. Pomyślałem więc, że dodam moje dwa centy.
Dla podanego kodu:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Jeśli miałbyś użyć ||
operatora, otrzymujesz pierwszą nie-fałszywą wartość:
var result = a || b || c || d || e || f; // result === 1
Jeśli użyjesz typowej metody koalescencji, jak tutaj zamieszczono , otrzymasz c
, która ma wartość:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Żadne z tych nie wydaje mi się właściwe. W moim małym świecie logiki koalescencji, który może różnić się od twojego świata, uważam niezdefiniowane, zerowe i NaN za wszystkie „zerowe”. Oczekiwałbym więc powrotu d
(zero) z metody koalescencji.
Jeśli czyjś mózg działa jak mój, a ty chcesz go wykluczyć NaN
, ta metoda osiągnie to:
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;
}
Dla tych, którzy chcą, aby kod był jak najkrótszy i nie przeszkadzało mu trochę braku jasności, możesz również użyć tego, jak sugeruje @impinball. Wykorzystuje to fakt, że NaN nigdy nie jest równy NaN. Więcej na ten temat możesz przeczytać tutaj: Dlaczego NaN nie jest równe 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
składnia ma teraz status wniosku 1 etapu - nieważne łączenie