Operator Ternary Javascript vs. ||

17

Saya telah melihat beberapa kode node.js sebelumnya, dan saya perhatikan bahwa orang yang menulisnya sepertinya menyukai sintaks berikut:

var fn = function (param) {
    var paramWithDefault = null == param ? 'Default Value' : param;
}

Atas apa yang saya anggap lebih ringkas:

var fn = function (param) {
    var paramWithDefault = param || 'Default Value';
}

Saya bertanya-tanya apakah bentuk kedua sebenarnya sintaksis JavaScript yang lebih dapat diterima secara sosial, saya sudah melihatnya lebih sering di alam liar daripada operator ternary untuk tujuan ini.

Saya perhatikan bahwa dalam contoh pertama dia menggunakan double sama dengan (bukan triple sama dengan) yang berarti akan dihitung "tidak terdefinisi" sebagai nol, yang akan mengurangi satu dampak yang dapat saya pikirkan. Namun, saya telah membaca di banyak tempat bahwa == adalah operator yang agak jahat dalam JavaScript (JSLint sangat menentangnya, IIRC).

Ed James
sumber
2
Komentator: komentar dimaksudkan untuk mencari klarifikasi, bukan untuk diskusi panjang. Jika Anda punya solusi, tinggalkan jawaban. Jika solusi Anda sudah diposting, harap perbarui. Jika Anda ingin mendiskusikan pertanyaan ini dengan orang lain, silakan gunakan obrolan . Lihat FAQ untuk informasi lebih lanjut.

Jawaban:

17

Karena kode ini akan dievaluasi menjadi 'Nilai Default' setiap kali Anda memasukkan 0, "", false, atau beberapa nilai palsu lainnya.

function fn(param) {
  var paramWithDefault = param || 'Default Value';
  return paramWithDefault;
}

Mungkin tidak menggigit Anda tentang cara Anda menggunakan fungsi khusus ini, tetapi itu adalah pola yang buruk untuk dihindari ketika Anda benar-benar peduli untuk melewatkan hal-hal seperti string kosong atau 0 atau boolean.

Peter Smith
sumber
Anda hanya boleh menggunakan null menyatu pada suatu objek, dan jika suatu objek didefinisikan, maka ini tidak akan berfungsi. Dengan mungkin pengecualian dari string kosong.
Malfist
4
Perbandingan nol adalah poin yang baik, yang bisa sangat tidak terduga.
Ed James
1
+1 - masalah ini justru mengapa Python (akhirnya) menambahkan sintaks "x if y else z". Semantik untuk operator logis ini cukup umum, dan kesalahan umum yang sama cenderung muncul setiap kali idiom bergantung pada mereka untuk melakukan pekerjaan operator seleksi bersyarat.
Steve314
jangan lupa untuk meletakkan konstruk Anda dalam tanda kurung, jika Anda menggunakannya bersama-sama dengan penggabungan string var txt = 'Hello, ' + (user_name||'User') + '!';akan berhasil, tetapi tanpa tanda kurung - Anda akan mendapatkannya undefined. jsfiddle.net/4mFAB/1
c69
7

Yang benar-benar Anda butuhkan adalah operator penggabungan nol. Tetapi melihat bahwa javascript tidak benar-benar memilikinya, programmer biasanya menggunakan '||' untuk berdiri untuk itu.

Namun, keduanya masuk akal. Bagi mereka yang tidak mengerti apa itu operator null coalesce, operator ternary mungkin lebih mudah dipahami.

Malfist
sumber
Operator terkait lainnya adalah operator Ikon yang dieja IIRC "lain". Ini mengakui hasil "gagal" khusus dari argumen pertama, dan menggunakan argumen kedua dalam kasus itu sebagai alternatif. Saya agak berharap Piton "x jika Anda lain z" diimplementasikan menggunakan dua operator yang terpisah - operator "jika" biner dan operator "lain" seperti Ikon - dengan dua operator yang dapat digunakan secara mandiri. Namun, Icon tidak mendukung gaya itu, malah melakukan sesuatu yang aneh dengan operator relatif.
Steve314
@ Steve314: Python memang memiliki sesuatu yang Anda inginkan: operator lain yang terpisah [false-part, true-part]dengan operator yang terpisah jika [..][bool(condition)]digabungkan menjadi [false-part, true-part][bool(condition)]. Jika Anda ingin perilaku malas, Anda dapat dengan lambda bagian yang benar dan yang salah.
Lie Ryan