Никто не упомянул здесь потенциал для NaN
, который - для меня - также нулевое значение. Итак, я решил добавить свои два цента.
Для данного кода:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Если вы используете ||
оператор, вы получите первое не ложное значение:
var result = a || b || c || d || e || f; // result === 1
Если вы используете типичный метод объединения, как выложено здесь , вы получите c
, который имеет значение:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Ничто из этого не кажется мне правильным. В моем собственном маленьком мире логики слияния, который может отличаться от вашего мира, я считаю, что undefined, null и NaN - все это «ноль». Итак, я ожидал бы получить обратно d
(ноль) от метода объединения.
Если чей-то мозг работает, как мой, и вы хотите исключить его NaN
, то этот метод выполнит следующее:
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;
}
Для тех, кто хочет, чтобы код был как можно более коротким, и не возражал против некоторой неясности, вы также можете использовать это, как предложено @impinball. Это использует тот факт, что NaN никогда не равен NaN. Вы можете прочитать больше об этом здесь: почему NaN не равен 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
синтаксис сейчас находится на этапе 1, статус заявки - слияние нулевое