Saya men-debug beberapa JavaScript, dan tidak bisa menjelaskan apa ||
fungsinya?
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
Bisakah seseorang memberi saya petunjuk, mengapa orang ini menggunakan var title = title || 'ERROR'
? Terkadang saya melihatnya tanpa var
deklarasi juga.
javascript
parameters
optional-parameters
or-operator
opHASnoNAME
sumber
sumber
falsy
, bukan HANYAundefined
. Jumlah yang saya lihatdoWeDoIt = doWeDoIt || true
, sudah cukup untuk membuat saya menangis. (yaitudoWeDoIt
sekarang tidak akan pernahfalse
)??
. Javascript mengevaluasi objek non-null sepertitrue
(atau lebih baik evalualtes objek null ke false)Jawaban:
Ini berarti
title
argumennya opsional. Jadi jika Anda memanggil metode tanpa argumen itu akan menggunakan nilai default"Error"
.Ini singkatan untuk menulis:
Trik semacam steno dengan ekspresi boolean juga umum di Perl. Dengan ekspresi:
mengevaluasi
true
apakah salah satua
ataub
tidaktrue
. Jadi, jikaa
benar, Anda tidak perlu memeriksab
sama sekali. Ini disebut evaluasi boolean hubung singkat sehingga:pada dasarnya memeriksa apakah
title
dievaluasifalse
. Jika ya, "kembali""Error"
, jika tidak kembalititle
.sumber
Apa itu operator pipa ganda (
||
)?Operator pipa ganda (
||
) adalah operator logisOR
. Dalam sebagian besar bahasa ini bekerja dengan cara berikut:false
, itu memeriksa nilai kedua. Jika itutrue
, ia kembalitrue
dan jika itufalse
, ia kembalifalse
.true
, selalu kembalitrue
, tidak peduli apa nilai kedua.Jadi pada dasarnya ini berfungsi seperti fungsi ini:
Jika Anda masih tidak mengerti, lihat tabel ini:
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: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 sebagaifalse
; kalau tidak diperlakukan sebagaitrue
.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:Terkejut? Sebenarnya, ini "kompatibel" dengan
||
operator tradisional . Dapat ditulis sebagai fungsi berikut:Jika Anda melewatkan nilai kebenaran sebagai
x
, itu mengembalikanx
, yaitu nilai kebenaran. Jadi jika Anda menggunakannya nanti dalamif
klausa:kamu dapatkan
"Either x or y is truthy."
.Jika
x
itu palsu,eitherXorY
akan menjadiy
. Dalam hal ini Anda akan mendapatkan"Either x or y is truthy."
jikay
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 apax = x || y
artinya. Jikax
benar,x
ditugaskanx
, maka sebenarnya tidak ada yang terjadi; jikay
tidak ditugaskanx
. 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 harusundefined
ataunull
) sebagai parameter. Pertimbangkan contoh berikut:Terlihat valid pada pandangan pertama. Namun, apa yang akan terjadi jika Anda meneruskan
false
sebagaiflagA
parameter (karena itu boolean, yaitu bisatrue
ataufalse
)? Itu akan menjaditrue
. Dalam contoh ini, tidak ada cara untuk mengaturflagA
kefalse
.Ini akan menjadi ide yang baik untuk secara eksplisit memeriksa apakah
flagA
iniundefined
, seperti itu: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 .
sumber
title = title || 'Error'
berartiif (title) { title = title; } else { title = 'Error'; }
title ||= 'Error'
.Jika judul tidak disetel, gunakan 'KESALAHAN' sebagai nilai default.
Lebih umum:
Dibaca: Set foobar ke
foo
ataudefault
. Anda bahkan dapat membuat rantai ini berkali-kali:sumber
Menjelaskan ini sedikit lagi ...
The
||
Operator adalah logis-or
operator. Hasilnya benar jika bagian pertama benar dan benar jika bagian kedua benar dan benar jika kedua bagian itu benar. Untuk kejelasan, ini dia dalam tabel:Sekarang perhatikan sesuatu di sini? Jika
X
benar, hasilnya selalu benar. Jadi jika kita tahu ituX
benar, kita tidak perlu memeriksaY
sama sekali. Banyak bahasa dengan demikian menerapkan evaluator "korsleting" untuk logis-or
(dan logis-and
datang dari arah lain). Mereka memeriksa elemen pertama dan jika itu benar mereka tidak repot-repot memeriksa yang kedua sama sekali. Hasilnya (dalam hal logis) adalah sama, tetapi dalam hal eksekusi ada potensi perbedaan besar jika elemen kedua mahal untuk dihitung.Jadi apa hubungannya ini dengan contoh Anda?
Mari kita lihat itu. The
title
elemen dilewatkan ke fungsi Anda. Dalam JavaScript jika Anda tidak mengirimkan parameter, defaultnya adalah nilai nol. Juga dalam JavaScript jika variabel Anda adalah nilai nol, itu dianggap salah oleh operator logis. Jadi jika fungsi ini disebut dengan judul yang diberikan, itu adalah nilai yang tidak salah dan dengan demikian ditugaskan ke variabel lokal. Namun, jika tidak diberi nilai, itu adalah nilai nol dan dengan demikian salah.or
Operator logis kemudian mengevaluasi ekspresi kedua dan mengembalikan 'Kesalahan' sebagai gantinya. Jadi sekarang variabel lokal diberi nilai 'Kesalahan'.Ini berfungsi karena penerapan ekspresi logis dalam JavaScript. Itu tidak mengembalikan nilai boolean yang tepat (
true
ataufalse
) tetapi sebaliknya mengembalikan nilai itu diberikan di bawah beberapa aturan untuk apa yang dianggap setara dengantrue
dan apa yang dianggap setara denganfalse
. Cari referensi JavaScript Anda untuk mempelajari apa yang dianggap benar atau salah oleh JavaScript dalam konteks boolean.sumber
Pipa ganda singkatan dari "OR" logis. Ini tidak benar-benar terjadi ketika "parameter tidak disetel", karena secara ketat di javascript jika Anda memiliki kode seperti ini:
Lalu telepon
tidak setara.
Pipa ganda (||) akan melemparkan argumen pertama ke boolean dan jika boolean yang dihasilkan benar - lakukan penugasan jika tidak maka akan menetapkan bagian yang tepat.
Ini penting jika Anda memeriksa parameter yang tidak disetel.
Katakanlah, kita memiliki fungsi setSalary yang memiliki satu parameter opsional. Jika pengguna tidak menyediakan parameter maka nilai default 10 harus digunakan.
jika Anda melakukan pemeriksaan seperti ini:
Ini akan memberikan hasil yang tidak terduga seperti panggilan
Ini masih akan mengatur 10 mengikuti aliran yang dijelaskan di atas.
sumber
Pada dasarnya memeriksa apakah nilai sebelum || bernilai true, jika ya, dibutuhkan nilai ini, jika tidak, dibutuhkan nilai setelah ||.
Nilai yang akan diambil nilainya setelah || (Sejauh yang saya ingat):
sumber
Sementara jawaban Cletus benar, saya merasa lebih detail harus ditambahkan sehubungan dengan "evaluate to false" dalam JavaScript.
Tidak hanya memeriksa jika judul / msg telah disediakan, tetapi juga jika salah satu dari mereka adalah falsy . yaitu salah satu dari yang berikut:
Begitu juga
Jika judul itu benar (yaitu, bukan falsy, maka title = "titleMessage" dll.) Maka operator Boolean OR (||) telah menemukan satu nilai 'benar', yang berarti ia mengevaluasi nilai true, sehingga membuat sirkuit pendek dan mengembalikan nilai sebenarnya (judul).
Jika judul salah (yaitu salah satu dari daftar di atas), maka operator Boolean OR (||) telah menemukan nilai 'salah', dan sekarang perlu mengevaluasi bagian lain dari operator, 'Kesalahan', yang dievaluasi menjadi true , dan karenanya dikembalikan.
Tampaknya juga (setelah beberapa percobaan konsol pembakar cepat) jika kedua sisi operator mengevaluasi ke false, ia mengembalikan operator 'palsu' kedua.
yaitu
kembali tidak terdefinisi, ini mungkin memungkinkan Anda untuk menggunakan perilaku yang ditanyakan dalam pertanyaan ini ketika mencoba judul / pesan default ke "". yaitu setelah berjalan
foo akan diatur ke ""
sumber
operator pipa ganda
Apakah contoh ini bermanfaat?
bisa juga
sumber
Untuk menambahkan beberapa penjelasan kepada semua yang dikatakan sebelum saya, saya harus memberi Anda beberapa contoh untuk memahami konsep logis.
Ini berarti jika sisi kiri dievaluasi sebagai pernyataan yang benar itu akan selesai dan sisi kiri akan dikembalikan dan ditugaskan ke variabel. dalam kasus lain sisi kanan akan dikembalikan dan ditugaskan.
Dan operator memiliki struktur yang berlawanan seperti di bawah ini.
sumber
|| adalah operator boolean OR. Seperti dalam javascript, undefined, null, 0, false dianggap sebagai nilai falsy .
Itu hanya berarti
sumber
Kutipan: "Apa arti konstruk x = x || y?"
Menetapkan nilai default.
Ini berarti memberikan nilai default y ke x , dalam kasus x masih menunggu nilainya tetapi belum menerimanya atau sengaja dihilangkan untuk kembali ke default.
sumber
function getKeys(x) { x = x || this ; .... }
yang dapat digunakan tanpa modifikasi sebagai fungsi mandiri, sebagai metode properti dalam prototipe dan sebagai metode elemen yang bisa mendapatkan elemen lain sebagai argumennya sebagai `[elemen] .getKeys (anotherElement);`Dan saya harus menambahkan satu hal lagi: Tulisan singkat ini adalah kekejian. Ini menyalahgunakan optimasi juru bahasa yang tidak disengaja (tidak mengganggu operasi kedua jika yang pertama adalah benar) untuk mengontrol tugas. Penggunaan itu tidak ada hubungannya dengan tujuan operator. Saya tidak percaya itu harus digunakan.
Saya lebih suka operator ternary untuk inisialisasi, misalnya,
Ini menggunakan operasi bersyarat satu baris untuk tujuan yang benar. Ini masih memainkan game yang tidak sedap dipandang dengan kebenaran tetapi, itu Javascript untuk Anda.
sumber