Apakah ada operator penggabungan nol di Javascript?
Misalnya, dalam C #, saya bisa melakukan ini:
String someString = null;
var whatIWant = someString ?? "Cookies!";
Perkiraan terbaik yang dapat saya ketahui untuk Javascript menggunakan operator kondisional:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
Yang agak IMHO icky. Bisakah saya berbuat lebih baik?
javascript
operators
null-coalescing-operator
null-coalescing
Daniel Schaffer
sumber
sumber
x ?? y
sintaks sekarang dalam status proposal tahap 1 - nullish coalescingx ?? y
) dan operator rantai opsional (user.address?.street
) sekarang keduanya Tahap 4. Berikut adalah deskripsi yang baik tentang apa artinya: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Jawaban:
Memperbarui
JavaScript sekarang mendukung operator penggabungan nullish (??) . Ini mengembalikan operan sisi kanan ketika operan sisi kiri adalah
null
atauundefined
, dan sebaliknya mengembalikan operan sisi kiri.Silakan periksa kompatibilitas sebelum menggunakannya.
Setara JavaScript dari operator penggabungan C # null (
??
) menggunakan logika OR (||
):Ada beberapa kasus (diklarifikasi di bawah) bahwa perilaku tidak cocok dengan C #, tetapi ini adalah cara umum, singkat untuk menetapkan nilai default / alternatif dalam JavaScript.
Klarifikasi
Terlepas dari jenis operan pertama, jika casting ke hasil Boolean
false
, tugas akan menggunakan operan kedua. Waspadalah terhadap semua kasus di bawah ini:Ini berarti:
sumber
||
mengembalikan nilai "truey" pertama atau "falsey" terakhir (jika tidak ada yang dapat mengevaluasi ke true) dan yang&&
bekerja dengan cara yang berlawanan: mengembalikan nilai truey terakhir atau yang pertama falsey.var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
var value = myObj && myObj.property || ''
akan kembali ke''
apakah myObj atau myObj.property falsy.solusi ini berfungsi seperti fungsi SQL coalesce, ia menerima sejumlah argumen, dan mengembalikan nol jika tidak ada yang memiliki nilai. Berperilaku seperti C # ?? operator dalam arti bahwa "", false, dan 0 dianggap TIDAK NULL dan karenanya dianggap sebagai nilai aktual. Jika Anda berasal dari latar belakang .net, ini akan menjadi solusi perasaan yang paling alami.
sumber
for(var i in arguments)
tidak menjamin urutan iterasi, menurut MDN . Lihat juga Mengapa JavaScript Untuk ... Di loop tidak disarankan untuk array? dan mengapa menggunakan "untuk ... dalam" dengan iterasi array adalah ide yang buruk? .Ya, itu akan segera datang. Lihat proposal di sini dan status implementasi di sini .
Ini terlihat seperti ini:
Contoh
sumber
x ?? y
) dan operator rantai opsional (user.address?.street
) sekarang keduanya Tahap 4. Berikut adalah deskripsi yang baik tentang apa artinya: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Jika
||
sebagai pengganti C #??
tidak cukup baik dalam kasus Anda, karena menelan string dan nol kosong, Anda selalu dapat menulis fungsi Anda sendiri:sumber
false
jika (ketat) null / tidak terdefinisi dantrue
sebaliknya - menggunakannya dengan logika atau; itu bisa lebih mudah dibaca daripada banyak panggilan fungsi bersarang. misalnya$N(a) || $N(b) || $N(c) || d
lebih mudah dibaca daripada$N($N($N(a, b), c), d)
.if .. return .. else ... return
adalah kasus yang sempurna untuk seorang ternary.return (value === null || value === void 0) ? ifnull : value;
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:
Jika Anda menggunakan
||
operator, Anda mendapatkan nilai non-false pertama:Jika Anda menggunakan metode penggabungan yang khas, seperti yang diposting di sini , Anda akan mendapatkannya
c
, yang memiliki nilai: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: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?
sumber
typeof
+num.toString() === 'NaN'
redundan), simpan argumen saat ini dalam variabel, bukanarguments[i]
.!== 'number'
cek karena saya sudah mengevaluasi bahwa itu bukannull
atauundefined
, tetapi ini memiliki keuntungan menjadi sangat jelas bagi siapa saja yang membaca kode ini dan kondisinya akan bekerja terlepas dari pesanan. Saran Anda yang lain sedikit mempersingkat kodenya, jadi saya akan menggunakannya.arg !== arg
, tetapi Anda harusarg === arg
... kemudian berhasil. Namun, itu memiliki kerugian menjadi sangat tidak jelas tentang apa yang Anda lakukan ... memerlukan komentar dalam kode untuk mencegah dihapus oleh orang berikutnya yang melewati kode dan dianggaparg === arg
berlebihan ... tapi saya akan memasangnya bagaimanapun.Waspadalah terhadap definisi spesifik JavaScript tentang null. ada dua definisi untuk "tidak ada nilai" dalam javascript. 1. Null: ketika suatu variabel adalah null, itu berarti tidak mengandung data di dalamnya, tetapi variabel sudah didefinisikan dalam kode. seperti ini:
dalam kasus seperti itu, tipe variabel Anda sebenarnya adalah Object. menguji.
Tidak terdefinisi: ketika suatu variabel belum didefinisikan sebelumnya dalam kode, dan seperti yang diharapkan, itu tidak mengandung nilai apa pun. seperti ini:
jika demikian, jenis variabel Anda 'tidak terdefinisi'.
perhatikan bahwa jika Anda menggunakan operator perbandingan konversi tipe (==), JavaScript akan bertindak sama untuk kedua nilai kosong ini. untuk membedakannya, selalu gunakan operator perbandingan ketat-tipe (===).
sumber
var u = undefined;
Setelah membaca klarifikasi Anda, jawaban @Ates Goral menyediakan cara melakukan operasi yang sama dengan yang Anda lakukan dalam C # dalam JavaScript.
@Gumbo jawaban menyediakan cara terbaik untuk memeriksa nol; namun, penting untuk mencatat perbedaan
==
versus===
dalam JavaScript terutama ketika menyangkut masalah pemeriksaanundefined
dan / ataunull
.Ada artikel yang sangat bagus tentang perbedaan dua istilah di sini . Pada dasarnya, pahami bahwa jika Anda menggunakan
==
alih-alih===
, JavaScript akan mencoba menyatukan nilai yang Anda bandingkan dan mengembalikan apa hasil perbandingan setelah penggabungan ini.sumber
Perhatikan bahwa
create-react-app
rantai alat React mendukung penggabungan nol sejak versi 3.3.0 (dirilis 5.12.2019) . Dari catatan rilis:Ini mengatakan, jika Anda menggunakan
create-react-app
3.3.0+ Anda dapat mulai menggunakan operator null-coalesce hari ini di aplikasi Bereaksi Anda.sumber
Ya, dan usulannya adalah Tahap 4 sekarang. Ini berarti bahwa proposal tersebut siap untuk dimasukkan dalam standar formal ECMAScript. Anda sudah dapat menggunakannya di versi desktop Chrome, Edge dan Firefox baru-baru ini, tetapi kami harus menunggu sedikit lebih lama hingga fitur ini mencapai stabilitas lintas-browser.
Lihat contoh berikut untuk menunjukkan perilakunya:
Contoh sebelumnya setara dengan:
Perhatikan bahwa nullish coalescing tidak akan mengancam nilai palsu seperti yang dilakukan
||
operator (hanya memeriksaundefined
ataunull
nilai), maka cuplikan berikut ini akan bertindak sebagai berikut:Untuk pengguna TypeScript, mulai dari TypeScript 3.7 , fitur ini juga tersedia sekarang.
sumber
Mudah-mudahan ini akan segera tersedia dalam Javascript, karena masih dalam tahap proposal pada April, 2020. Anda dapat memantau status di sini untuk kompatibilitas dan dukungan - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Referensi / Operator / Nullish_coalescing_operator
Untuk orang yang menggunakan TypeScript, Anda bisa menggunakan operator penggabungan nullish dari Typescript 3.7
Dari dokumen -
sumber
Ok jawaban yang tepat
Apakah ada di JavaScript? Ya, benar. TAPI. Saat ini pada 2020-02-06 di Tahap 3 dan belum didukung di mana-mana. Ikuti tautan di URL di bawah ini dan buka tajuk "Spesifikasi" dan "Kompatibilitas peramban" untuk info lebih lanjut tentang di mana ia berada.
Kutipan dari: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
Mau contoh? Ikuti tautan yang saya posting, semuanya ada.
sumber
Sekarang ia memiliki dukungan penuh dalam versi terbaru dari peramban utama seperti Chrome, Edge, Firefox, Safari dll. Berikut adalah perbandingan antara operator nol dan Operator Penggabungan Nullish
sumber