Di sini tidak ada yang menyebutkan potensi NaN
, yang - bagi saya - juga merupakan nilai nol-ish. Jadi, saya pikir saya akan menambahkan dua sen saya.
Untuk kode yang diberikan:
var a,
b = null,
c = parseInt('Not a number'),
d = 0,
e = '',
f = 1
;
Jika Anda menggunakan ||
operator, Anda mendapatkan nilai non-false pertama:
var result = a || b || c || d || e || f; // result === 1
Jika Anda menggunakan metode penggabungan yang khas, seperti yang diposting di sini , Anda akan mendapatkannya c
, yang memiliki nilai:NaN
var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN'
Tak satu pun dari ini tampaknya benar bagi saya. Dalam dunia kecil saya sendiri dari logika bersatu, yang mungkin berbeda dari dunia Anda, saya menganggap tidak terdefinisi, null, dan NaN sebagai semuanya "null-ish". Jadi, saya berharap untuk mendapatkan kembali d
(nol) dari metode penggabungan.
Jika otak siapa pun bekerja seperti otak saya, dan Anda ingin mengecualikan NaN
, maka metode ini akan mencapai itu:
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;
}
Bagi mereka yang menginginkan kode sesingkat mungkin, dan tidak keberatan sedikit kejelasan, Anda juga dapat menggunakan ini seperti yang disarankan oleh @impinball. Ini mengambil keuntungan dari kenyataan bahwa NaN tidak pernah sama dengan NaN. Anda dapat membaca lebih lanjut tentang itu di sini: Mengapa NaN tidak sama dengan 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
sintaks sekarang dalam status proposal tahap 1 - nullish coalescing