Apa itu operator pipa ganda ( ||)?
Operator pipa ganda ( ||) adalah operator logisOR . Dalam sebagian besar bahasa ini bekerja dengan cara berikut:
- Jika nilai pertama adalah
false, itu memeriksa nilai kedua. Jika itu true, ia kembali truedan jika itu false, ia kembali false.
- Jika nilai pertama
true, selalu kembali true, tidak peduli apa nilai kedua.
Jadi pada dasarnya ini berfungsi seperti fungsi ini:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Jika Anda masih tidak mengerti, lihat tabel ini:
| true false
------+---------------
true | true true
false | true false
Dengan kata lain, itu hanya salah ketika kedua nilai tersebut salah.
Apa bedanya dengan JavaScript?
JavaScript sedikit berbeda, karena ini adalah bahasa yang diketik secara longgar . Dalam hal ini berarti Anda dapat menggunakan ||operator dengan nilai yang bukan boolean. Meskipun tidak masuk akal, Anda dapat menggunakan operator ini dengan misalnya fungsi dan objek:
(function(){}) || {}
Apa yang terjadi disana?
Jika nilainya bukan boolean, JavaScript membuat konversi implisit ke boolean . Ini berarti bahwa jika nilai falsey (misalnya 0, "", null, undefined(lihat juga Semua nilai falsey di JavaScript )), ia akan diperlakukan sebagai false; kalau tidak diperlakukan sebagai true.
Jadi contoh di atas harus memberi true, karena fungsi kosong itu benar. Ya tidak. Ini mengembalikan fungsi kosong. Itu karena ||operator JavaScript tidak berfungsi seperti yang saya tulis di awal. Cara kerjanya sebagai berikut:
- Jika nilai pertama adalah falsey , itu mengembalikan nilai kedua .
- Jika nilai pertama adalah truthy , ia mengembalikan nilai pertama .
Terkejut? Sebenarnya, ini "kompatibel" dengan ||operator tradisional . Dapat ditulis sebagai fungsi berikut:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Jika Anda melewatkan nilai kebenaran sebagai x, itu mengembalikan x, yaitu nilai kebenaran. Jadi jika Anda menggunakannya nanti dalam ifklausa:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
kamu dapatkan "Either x or y is truthy.".
Jika xitu palsu, eitherXorYakan menjadi y. Dalam hal ini Anda akan mendapatkan "Either x or y is truthy."jika yitu benar; kalau tidak Anda akan mendapatkan "Neither x nor y is truthy".
Pertanyaan sebenarnya
Sekarang, ketika Anda tahu cara ||kerja operator, Anda mungkin dapat mengetahui sendiri apa x = x || yartinya. Jika xbenar, xditugaskan x, maka sebenarnya tidak ada yang terjadi; jika ytidak ditugaskan x. Ini biasanya digunakan untuk mendefinisikan parameter default dalam fungsi. Namun, ini sering dianggap praktik pemrograman yang buruk , karena mencegah Anda melewatkan nilai falsey (yang tidak harus undefinedatau null) sebagai parameter. Pertimbangkan contoh berikut:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Terlihat valid pada pandangan pertama. Namun, apa yang akan terjadi jika Anda meneruskan falsesebagai flagAparameter (karena itu boolean, yaitu bisa trueatau false)? Itu akan menjadi true. Dalam contoh ini, tidak ada cara untuk mengatur flagAke false.
Ini akan menjadi ide yang baik untuk secara eksplisit memeriksa apakah flagAini undefined, seperti itu:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Meskipun lebih panjang, selalu bekerja dan lebih mudah untuk dipahami.
Anda juga dapat menggunakan sintaks ES6 untuk parameter fungsi default , tetapi perhatikan bahwa itu tidak berfungsi di browser lama (seperti IE). Jika Anda ingin mendukung browser ini, Anda harus mengubah kode Anda dengan Babel .
Lihat juga Operator Logis di MDN .
falsy, bukan HANYAundefined. Jumlah yang saya lihatdoWeDoIt = doWeDoIt || true, sudah cukup untuk membuat saya menangis. (yaitudoWeDoItsekarang tidak akan pernahfalse)