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 true
dan 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 if
klausa:
(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 x
itu palsu, eitherXorY
akan menjadi y
. Dalam hal ini Anda akan mendapatkan "Either x or y is truthy."
jika y
itu 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 || y
artinya. Jika x
benar, x
ditugaskan x
, maka sebenarnya tidak ada yang terjadi; jika y
tidak 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 undefined
atau 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 false
sebagai flagA
parameter (karena itu boolean, yaitu bisa true
atau false
)? Itu akan menjadi true
. Dalam contoh ini, tidak ada cara untuk mengatur flagA
ke false
.
Ini akan menjadi ide yang baik untuk secara eksplisit memeriksa apakah flagA
ini 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. (yaitudoWeDoIt
sekarang tidak akan pernahfalse
)