Тут ніхто не згадав про потенціал 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'
Жодне з них мені не здається правильним. У моєму власному маленькому світі зв'язаної логіки, який може відрізнятися від вашого світу, я вважаю невизначеним, нульовим і 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 етапу - нульове з’єднання