Saya melihat beberapa kode yang tampaknya menggunakan operator saya tidak mengenali, dalam bentuk dua tanda seru, seperti: !!
. Bisakah seseorang tolong beri tahu saya apa yang dilakukan operator ini?
Konteks di mana saya melihat ini adalah,
this.vertical = vertical !== undefined ? !!vertical : this.vertical;
javascript
operators
Teori Hexagon
sumber
sumber
if(vertical !== undefined) this.vertical = Boolean(vertical);
- jauh lebih bersih dan lebih jelas apa yang sedang terjadi, tidak memerlukan tugas yang tidak perlu, sepenuhnya standar, dan secepat (pada FF dan Chrome saat ini) jsperf.com/boolean-conversion-speed .Boolean(5/0)
tidak sama dengan!!5/0
!!5/0
menghasilkanInfinity
daripadatrue
, seperti yang diproduksi olehBoolean(5/0)
.!!5/0
setara dengan(!!5)/0
- aliastrue/0
- karena!
operator memiliki prioritas lebih tinggi daripada/
operator. Jika Anda ingin Booleanize5/0
menggunakan double-bang, Anda harus menggunakannya!!(5/0)
.Jawaban:
Konversi
Object
keboolean
. Jika itu falsey (misalnya0
,null
,undefined
, dll), itu akan menjadifalse
, jika tidak,true
.Jadi
!!
bukan operator, itu hanya!
operator dua kali.Contoh Dunia Nyata "Uji versi IE":
Jika Anda ⇒
Tetapi jika Anda ⇒
sumber
Ini adalah cara yang sangat tidak jelas untuk melakukan konversi tipe.
!
adalah TIDAK . Begitu!true
jugafalse
, dan!false
sekarangtrue
.!0
adalahtrue
, dan!1
sekarangfalse
.Jadi, Anda mengonversi nilai menjadi boolean, lalu membalikkannya, lalu membalikkannya lagi.
sumber
userId ? true : false
membuat lebih jelas bahwa ada konversi yang terjadi dan menangani kasus di mana nilai userId mungkin telah secara eksplisit diatur keundefined
!!var
ke dalamBoolean(var)
.. dan!!
lebih cepat (lebih sedikit instruksi untuk diproses) dan lebih pendek dari alternatif.userId != 0
benar untuknull
,NaN
danundefined
, tetapi salah untukfalse
. Jika Anda menginginkan perilaku itu, Anda mungkin harus menjelaskannya. Tetapi bahkan jika itu bekerja persis sama dengan!!userId
, tidak jelas apakah Anda ingin nilai-nilai tersebut menjadi salah di sini, atau apakah Anda hanya gagal mempertimbangkan aturan konversi tipe Javascript.!!expr
mengembalikan nilai Boolean (true
ataufalse
) tergantung pada kebenaran ekspresi. Lebih masuk akal bila digunakan pada jenis non-boolean. Pertimbangkan contoh-contoh ini, terutama contoh ke-3 dan selanjutnya:sumber
!!new Boolean(false) // true
!!Boolean(false) // false
new Boolean(false)
adalah sebuah objek dan sebuah objek adalah benar bahkan jika itu mengandung nilai palsu!String
,Number
,Date
, dll) yang dimaksudkan untuk menjadi callable sebagai fungsi juga, namun dalam hal ini hasilnya berbeda!new Boolean(false)
mengembalikan suatuobject
saatBoolean(false)
mengembalikan primitiffalse
. Semoga ini masuk akal.Seduh teh:
!!
bukan operator. Ini adalah penggunaan ganda!
- yang merupakan operator "bukan" yang logis.Dalam teori:
!
menentukan "kebenaran" dari nilai yang bukan:Yang benar adalah
false
tidaktrue
(itu sebabnya!false
hasiltrue
)Yang benar adalah
true
tidakfalse
(itu sebabnya!true
hasilfalse
)!!
menentukan "kebenaran" tentang apa nilai yang tidak tidak:Yang benar adalah itu
true
bukan tidaktrue
(itu sebabnya!!true
hasiltrue
)Yang benar adalah itu
false
bukan tidakfalse
(itu sebabnya!!false
hasilfalse
)Apa yang ingin kita tentukan dalam perbandingan adalah "kebenaran" tentang nilai referensi, bukan nilai referensi itu sendiri. Ada kasus penggunaan di mana kita mungkin ingin mengetahui kebenaran tentang suatu nilai, bahkan jika kita mengharapkan nilainya
false
(atau falsey), atau jika kita mengharapkan nilainya tidak menjadi tipeboolean
.Dalam praktek:
Pertimbangkan fungsi ringkas yang mendeteksi fungsionalitas fitur (dan dalam hal ini, kompatibilitas platform) dengan cara mengetik dinamis (alias "mengetik bebek"). Kami ingin menulis fungsi yang kembali
true
jika browser pengguna mendukung<audio>
elemen HTML5 , tetapi kami tidak ingin fungsi tersebut memunculkan kesalahan jika<audio>
tidak terdefinisi; dan kami tidak ingin menggunakantry ... catch
untuk menangani kemungkinan kesalahan (karena itu kotor); dan juga kami tidak ingin menggunakan pemeriksaan di dalam fungsi yang tidak akan secara konsisten mengungkapkan kebenaran tentang fitur (misalnya,document.createElement('audio')
masih akan membuat elemen yang disebut<audio>
bahkan jika HTML5<audio>
tidak didukung).Inilah tiga pendekatan:
Setiap fungsi menerima argumen untuk a
<tag>
danattribute
mencari, tetapi masing-masing mengembalikan nilai yang berbeda berdasarkan apa yang ditentukan perbandingan.Tapi tunggu, masih ada lagi!
Beberapa dari Anda mungkin memperhatikan bahwa dalam contoh khusus ini, seseorang dapat dengan mudah memeriksa properti menggunakan cara yang sedikit lebih berkinerja memeriksa apakah objek tersebut memiliki properti. Ada dua cara untuk melakukan ini:
Kami ngelantur ...
Betapapun jarangnya situasi ini, mungkin ada beberapa skenario di mana cara yang paling ringkas, paling berkinerja, dan dengan demikian paling disukai untuk mendapatkan
true
dari non-boolean, mungkin nilai yang tidak ditentukan memang dengan menggunakan!!
. Semoga ini dengan konyol membersihkannya.sumber
if()
pernyataan sudah melemparkan ekspresi ke boolean, secara eksplisit casting nilai kembali dari fungsi pengujian ke boolean adalah mubazir - karena "kebenaran" === benar sejauhif()
pernyataan berjalan. Atau apakah saya melewatkan skenario di mana Anda MEMBUTUHKAN ekspresi yang benar-benar menjadi booleantrue
?if()
Pernyataan @TomAuger melakukan cast boolean terhadap nilai falsey, tetapi katakan Anda ingin benar-benar mengatur flag boolean pada objek - itu tidak akan melemparkannya sepertiif()
pernyataan. Misalnyaobject.hasTheThing = !!castTheReturnValToBoolNoMatterWhat()
akan menetapkan salah satutrue
ataufalse
bukan nilai pengembalian nyata. Contoh lain adalah mungkin semua adminid
dari0
dan non-admin id1
atau lebih tinggi. Untuk mendapatkantrue
jika seseorang bukan admin, Anda bisa melakukannyaperson.isNotAdmin = !!admin.id
. Beberapa kasus penggunaan, tapi ringkas ketika ada.!!
mengkonversi nilai di sebelah kanan ke nilai boolean yang setara. (Pikirkan cara orang miskin "mengetik"). Its niat biasanya untuk menyampaikan kepada pembaca bahwa kode tidak peduli apa nilai dalam variabel, tapi apa itu "kebenaran" nilai adalah.sumber
!
masih membalik nilai ke kanan. Dalam kasus boolean yang paling kanan!
meniadakan nilai, sedangkan yang paling kiri!
meniadakan sekali lagi. Efek bersihnya adalah tidak ada perubahan, tetapi sebagian besar mesin akan menghasilkan kode op untuk negasi ganda.if(0){...
Javascript sudah tahu ini salah. Mengapa lebih baik dikatakanif(!!0){...
?!!foo
berlaku unary not operator dua kali dan digunakan untuk cast ke tipe boolean mirip dengan unary plus+foo
untuk cast ke number dan menyatukan string kosong''+foo
untuk cast ke string.Alih-alih peretasan ini, Anda juga dapat menggunakan fungsi konstruktor yang terkait dengan tipe primitif ( tanpa menggunakan
new
) untuk secara eksplisit memberikan nilai, yaitusumber
new
- sebagaimana disebutkan secara eksplisit dalam jawaban sayax="0"
saja melakukan:x=!!+x; //false
yang sama denganBoolean(Number(x))
Angka (atau + x) mengonversi string "0" menjadi 0, yang TIDAK bernilai false, dan kemudian Boolean (!! x) melemparkannya ke boolean secara langsung. Peasy mudah!!!+x
vsx !== "0"
?Begitu banyak jawaban melakukan setengah pekerjaan. Ya,
!!X
bisa dibaca sebagai "kebenaran X [diwakili sebagai boolean]". Tetapi!!
secara praktis, tidak penting untuk menentukan apakah suatu variabel tunggal (atau bahkan jika banyak variabel) benar atau salah.!!myVar === true
sama dengan adilmyVar
. Membandingkan!!X
dengan boolean "nyata" tidak terlalu berguna.Apa yang Anda peroleh
!!
adalah kemampuan untuk memeriksa kebenaran beberapa variabel terhadap satu sama lain dengan cara yang berulang, standar (dan ramah JSLint).Cukup casting :(
Itu adalah...
0 === false
adalahfalse
.!!0 === false
adalahtrue
.Di atas tidak begitu berguna.
if (!0)
memberi Anda hasil yang sama denganif (!!0 === false)
. Saya tidak bisa memikirkan kasus yang baik untuk casting variabel ke boolean dan kemudian membandingkan dengan boolean "benar".Lihat "== dan! =" Dari arah JSLint (catatan: Crockford memindahkan situsnya sedikit; tautan itu mungkin akan mati pada beberapa titik) untuk sedikit alasan:
Perhatikan bahwa ada beberapa kasus tidak intuitif di mana boolean akan dilemparkan ke nomor (
true
dilemparkan ke1
danfalse
ke0
) ketika membandingkan boolean dengan nomor. Dalam hal ini,!!
mungkin bermanfaat secara mental. Meskipun, sekali lagi, ini adalah kasus di mana Anda membandingkan boolean non-boolean dengan hard-typed, yang merupakan, imo, kesalahan serius.if (-1)
masih cara untuk pergi ke sini.Dan hal-hal menjadi lebih gila tergantung pada mesin Anda. WScript, misalnya, memenangkan hadiah.
Karena beberapa sejarah Windows jive , itu akan menampilkan -1 di kotak pesan! Cobalah di prompt cmd.exe dan lihat! Tapi
WScript.echo(-1 == test())
tetap memberi Anda 0, atau WScriptfalse
. Mengalihkan pandangan. Itu mengerikan.Membandingkan kebenaran :)
Tetapi bagaimana jika saya memiliki dua nilai, saya perlu memeriksa kebenaran yang sama?
Berpura-puralah kita memiliki
myVar1 = 0;
danmyVar2 = undefined;
.myVar1 === myVar2
adalah0 === undefined
dan jelas salah.!!myVar1 === !!myVar2
benar!!0 === !!undefined
dan benar! Kebenaran yang sama! (Dalam hal ini, keduanya "memiliki kebenaran palsu".)Jadi satu-satunya tempat Anda benar-benar perlu menggunakan "variabel boolean-cast" adalah jika Anda memiliki situasi di mana Anda memeriksa apakah kedua variabel memiliki kebenaran yang sama , bukan? Yaitu, gunakan
!!
jika Anda perlu melihat apakah dua vars keduanya benar atau keduanya palsu (atau tidak), yaitu, dengan kebenaran yang sama (atau tidak) .Saya tidak bisa memikirkan kasus penggunaan yang hebat, tidak dibuat-buat untuk itu begitu saja. Mungkin Anda memiliki "tautan" bidang dalam formulir?
Jadi sekarang jika Anda memiliki kebenaran untuk keduanya atau kepalsuan untuk nama dan usia pasangan, Anda dapat melanjutkan. Kalau tidak, Anda hanya punya satu bidang dengan nilai (atau pernikahan yang diatur sangat awal) dan perlu membuat kesalahan tambahan pada
errorObjects
koleksi Anda .EDIT 24 Okt 2017, 6 Feb 19:
Perpustakaan pihak ketiga yang mengharapkan nilai Boolean eksplisit
Inilah kasus yang menarik ...
!!
mungkin berguna ketika lib pihak ke-3 mengharapkan nilai Boolean eksplisit.Misalnya, False in JSX (React) memiliki arti khusus yang tidak dipicu oleh kepalsuan sederhana. Jika Anda mencoba mengembalikan sesuatu seperti yang berikut di BEJ Anda, mengharapkan int di
messageCount
...{messageCount && <div>You have messages!</div>}
... Anda mungkin terkejut melihat React render a
0
saat Anda memiliki nol pesan. Anda harus secara eksplisit mengembalikan false agar JSX tidak di-render. Pernyataan di atas kembali0
, yang dibuat oleh BEJ dengan senang hati, sebagaimana mestinya. Itu tidak bisa mengatakan Anda tidak punyaCount: {messageCount && <div>Get your count to zero!</div>}
(atau sesuatu yang kurang dibuat-buat).Salah satu perbaikan melibatkan bangbang, yang memaksa
0
ke dalam!!0
, yangfalse
:{!!messageCount && <div>You have messages!</div>}
Dokumen BEJ menyarankan Anda untuk lebih eksplisit, menulis kode komentar sendiri, dan menggunakan perbandingan untuk memaksa ke Boolean.
{messageCount > 0 && <div>You have messages!</div>}
Saya lebih nyaman menangani sendiri kepalsuan dengan ternary -
{messageCount ? <div>You have messages!</div> : false}
Kesepakatan yang sama dalam naskah: Jika Anda memiliki fungsi yang mengembalikan boolean (atau Anda memberikan nilai ke variabel boolean), Anda [biasanya] tidak dapat mengembalikan / menetapkan nilai boolean-y; itu haruslah boolean yang sangat diketik. Ini berarti, jika iff
myObject
sangat diketik ,return !myObject;
berfungsi untuk fungsi mengembalikan boolean, tetapireturn myObject;
tidak. Anda harusreturn !!myObject
mencocokkan ekspektasi Typcript.Perlu diingat bahwa ini adalah konvensi JSX & Typcript , bukan yang melekat pada JavaScript .
Tetapi jika Anda melihat aneh
0
di JSX Anda, pikirkan manajemen yang salah.sumber
if (!!window.Worker)
true
"eksternal" beroperasi persis sama dalamif
. Saya terus berusaha, tetapi saya tidak bisa memikirkan alasan untuk lebih memilih menuangkan kebenaran ke nilai boolean di luar jenis kasus "bandingkan kebenaran" yang berbelit-belit di atas, kecuali untuk keterbacaan jika Anda menggunakan kembali nilainya nanti, seperti dalamq
contoh perpustakaan . Tetapi meskipun begitu, ini adalah jalan pintas yang hilang informasi, dan saya berpendapat Anda lebih baik mengevaluasi kebenaran setiap saat.Ini hanya operator TIDAK logis, dua kali - digunakan untuk mengubah sesuatu menjadi boolean, misalnya:
sumber
Itu mengkonversi akhiran ke nilai Boolean.
sumber
Ini
not
operasi ganda . Yang pertama!
mengkonversi nilai menjadi boolean dan membalikkan nilai logisnya. Yang kedua!
membalikkan nilai logis kembali.sumber
Tampaknya
!!
hasil operator dalam negasi ganda.sumber
Ini mensimulasikan perilaku
Boolean()
fungsi casting. Yang pertamaNOT
mengembalikan nilai Boolean tidak peduli apa operan yang diberikan. Yang keduaNOT
meniadakanBoolean
nilai itu dan memberikan nilaitrue
Boolean dari suatu variabel. Hasil akhirnya sama dengan menggunakanBoolean()
fungsi pada suatu nilai.sumber
! adalah "boolean not", yang pada dasarnya typecasts nilai "enable" ke boolean kebalikannya. Kedua ! membalik nilai ini. Jadi,
!!enable
berarti "tidak tidak memungkinkan," memberi Anda nilaienable
sebagai boolean.sumber
Saya pikir layak disebutkan adalah, bahwa suatu kondisi yang dikombinasikan dengan logika DAN / ATAU tidak akan mengembalikan nilai boolean tetapi keberhasilan terakhir atau kegagalan pertama dalam kasus && dan keberhasilan pertama atau kegagalan terakhir dalam kasus || rantai kondisi.
Untuk melemparkan kondisi ke literal boolean sejati kita dapat menggunakan negasi ganda:
sumber
!!
menggunakanNOT
operasi dua kali bersama-sama,!
mengonversi nilai menjadiboolean
dan membalikkannya, berikut adalah contoh sederhana untuk melihat cara!!
kerjanya:Pada awalnya, tempat yang Anda miliki:
Kemudian Anda lakukan
!0
, itu akan dikonversi ke boolean dan dievaluasi ketrue
, karena 0 adalahfalsy
, sehingga Anda mendapatkan nilai yang dibalik dan dikonversi ke boolean, sehingga akan dievaluasitrue
.tetapi kami tidak ingin versi boolean yang terbalik dari nilai, jadi kami dapat membalikkannya lagi untuk mendapatkan hasil kami! Itu sebabnya kami menggunakan yang lain
!
.Pada dasarnya,
!!
pastikan kami, nilai yang kami dapatkan adalah boolean, bukan falsy, truthy atau string dll ...Jadi itu seperti menggunakan
Boolean
fungsi dalam javascript, tetapi cara mudah dan lebih pendek untuk mengkonversi nilai menjadi boolean:sumber
Itu
!!
membangun adalah cara sederhana untuk mengubah setiap ekspresi JavaScript ke setara Boolean nya.Misalnya:
!!"he shot me down" === true
dan!!0 === false
.sumber
0 === false
salah dan!!0 === false
benar.Itu bukan operator tunggal, itu dua. Ini setara dengan yang berikut dan merupakan cara cepat untuk memberikan nilai ke boolean.
sumber
Saya menduga ini adalah sisa dari C ++ di mana orang menimpa! operator tetapi bukan operator bool.
Jadi untuk mendapatkan jawaban negatif (atau positif) dalam hal ini Anda harus terlebih dahulu menggunakan! operator untuk mendapatkan boolean, tetapi jika Anda ingin memeriksa kasus positif akan digunakan !!.
sumber
The
if
danwhile
pernyataan dan?
Operator nilai-nilai penggunaan kebenaran untuk menentukan cabang kode untuk dijalankan. Misalnya, angka nol dan NaN dan string kosong salah, tetapi angka dan string lainnya benar. Objek benar, tetapi nilai yang tidak ditentukan dannull
keduanya salah.Operator negasi ganda
!!
menghitung nilai kebenaran suatu nilai. Ini sebenarnya dua operator, di mana!!x
berarti!(!x)
, dan berperilaku sebagai berikut:x
adalah nilai palsu,!x
adalahtrue
, dan!!x
merupakanfalse
.x
adalah nilai sejati,!x
adalahfalse
, dan!!x
sedangtrue
.Ketika digunakan pada tingkat atas konteks Boolean (
if
,while
, atau?
), yang!!
operator adalah perilaku no-op. Misalnya,if (x)
danif (!!x)
berarti hal yang sama.Penggunaan praktis
Namun memiliki beberapa kegunaan praktis.
Salah satu penggunaannya adalah dengan kompres objek ke nilai kebenarannya hilang, sehingga kode Anda tidak memegang referensi ke objek besar dan menjaganya tetap hidup. Menetapkan
!!some_big_object
ke variabel sebagai gantisome_big_object
melepaskannya untuk pengumpul sampah. Ini berguna untuk kasus yang menghasilkan objek atau nilai salah sepertinull
atau nilai yang tidak ditentukan, seperti deteksi fitur browser.Penggunaan lain, yang saya sebutkan dalam jawaban tentang
!!
operator yang sesuai C , adalah dengan alat "lint" yang mencari kesalahan ketik umum dan diagnosa cetak. Misalnya, dalam C dan JavaScript, beberapa kesalahan ketik umum untuk operasi Boolean menghasilkan perilaku lain yang outputnya tidak sebesar Boolean:if (a = b)
apakah penugasan diikuti dengan penggunaan nilai kebenaranb
;if (a == b)
adalah perbandingan kesetaraan.if (a & b)
adalah bitwise AND;if (a && b)
adalah AND logis.2 & 5
adalah0
(nilai salah);2 && 5
adalah benar.The
!!
Operator meyakinkan alat serat bahwa apa yang Anda tulis adalah apa yang Anda maksud: jangan operasi ini, kemudian mengambil nilai kebenaran hasilnya.Penggunaan ketiga adalah untuk menghasilkan XOR logis dan XNOR logis. Baik dalam C dan JavaScript,
a && b
melakukan AND logis (benar jika kedua belah pihak benar), dana & b
melakukan AND AND.a || b
melakukan OR logis (benar jika setidaknya ada yang benar), dana | b
melakukan bitwise OR. Ada XOR bitwise (eksklusif ATAU) sebagaia ^ b
, tetapi tidak ada operator built-in untuk XOR logis (benar jika tepat satu sisi benar). Anda mungkin, misalnya, ingin mengizinkan pengguna untuk memasukkan teks di salah satu dari dua bidang. Apa yang dapat Anda lakukan adalah mengkonversi masing-masing untuk nilai kebenaran dan membandingkan mereka:!!x !== !!y
.sumber
Negasi boolean ganda. Sering digunakan untuk memeriksa apakah nilai tidak ditentukan.
sumber
Banyak jawaban bagus di sini, tetapi jika Anda sudah membaca sampai sejauh ini, ini membantu saya untuk 'mendapatkannya'. Buka konsol di Chrome (dll), dan mulai mengetik:
Tentu saja, semua ini sama dengan hanya mengetik !! someThing, tetapi tanda kurung tambahan mungkin membantu membuatnya lebih dimengerti.
sumber
!!x
adalah singkatanBoolean(x)
Ledakan pertama memaksa mesin js untuk berjalan
Boolean(x)
tetapi juga memiliki efek samping pembalik nilai. Jadi ledakan kedua membatalkan efek samping.sumber
Ini memaksa semua hal menjadi boolean.
Sebagai contoh:
sumber
Pertanyaan ini telah dijawab dengan cukup teliti, tetapi saya ingin menambahkan jawaban yang saya harap sesederhana mungkin, menjadikan artinya !! sesederhana untuk dipahami.
Karena javascript memiliki apa yang disebut nilai "benar" dan "falsey", ada ungkapan bahwa ketika dievaluasi dalam ekspresi lain akan menghasilkan kondisi benar atau salah, meskipun nilai atau ekspresi yang diperiksa tidak benar
true
- benar ataufalse
.Contohnya:
Jika elemen itu benar-benar ada, ekspresi akan dievaluasi sebagai benar, dan blok kode akan dieksekusi.
Namun:
... TIDAK akan menghasilkan kondisi yang benar, dan blok kode tidak akan dieksekusi, bahkan jika elemen itu ada.
Mengapa? Karena
document.getElementById()
merupakan ungkapan "benar" yang akan dievaluasi sebagai benar dalamif()
pernyataan ini , tetapi itu bukan nilai boolean aktual daritrue
.Ganda "tidak" dalam hal ini cukup sederhana. Ini hanya dua
not
s kembali ke belakang.Yang pertama hanya "membalikkan" nilai truey atau falsey, menghasilkan tipe boolean yang sebenarnya, dan kemudian yang kedua "membalikkan" kembali ke keadaan semula, tetapi sekarang dalam nilai boolean yang sebenarnya. Dengan begitu Anda memiliki konsistensi:
dan
akan KEDUA mengembalikan true, seperti yang diharapkan.
sumber
Saya hanya ingin menambahkan itu
sama dengan
Tapi ini bisa menjadi masalah ketika sesuatu tidak terdefinisi.
Kuncinya di sini adalah rantai
&&
s akan mengembalikan nilai falsey pertama yang ditemukannya - dan ini dapat diumpankan ke pernyataan if, dll. Jadi, jika b.foo tidak terdefinisi, ia akan kembali tidak terdefinisi dan melewatib.foo.bar
pernyataan, dan kami tidak mendapatkan kesalahan.Return di atas tidak terdefinisi tetapi jika Anda memiliki string kosong, false, null, 0, undefined nilai-nilai itu akan kembali dan segera setelah kami menjumpai mereka dalam rantai -
[]
dan{}
keduanya "benar" dan kami akan melanjutkan apa yang disebut " && rantai "ke nilai berikutnya di sebelah kanan.PS Cara lain untuk melakukan hal yang sama adalah
(b || {}).foo
, karena jika b tidak didefinisikan makab || {}
akan menjadi{}
, dan Anda akan mengakses nilai dalam objek kosong (tidak ada kesalahan) alih-alih mencoba mengakses nilai dalam "undefined" (menyebabkan kesalahan ). Jadi,(b || {}).foo
sama denganb && b.foo
dan((b || {}).foo || {}).bar
sama denganb && b.foo && b.foo.bar
.sumber
({}).anything
akan memberiundefined
Setelah melihat semua jawaban hebat ini, saya ingin menambahkan alasan lain untuk menggunakan
!!
. Saat ini saya sedang bekerja dalam Angular 2-4 (TypeScript) dan saya ingin mengembalikan boolean sepertifalse
ketika pengguna saya tidak diautentikasi. Jika dia tidak diautentikasi, token-string akan menjadinull
atau""
. Saya bisa melakukan ini dengan menggunakan blok kode berikut:sumber
di sini adalah sepotong kode dari js sudut
niat mereka adalah untuk mengatur rafDidukung ke true atau false berdasarkan ketersediaan fungsi dalam requestAnimationFrame
itu dapat dicapai dengan memeriksa secara umum sebagai berikut:
cara singkat bisa menggunakan !!
jadi jika requestAnimationFrame diberi fungsi maka! requestAnimationFrame akan salah dan satu lagi! itu akan benar
jika requestAnimationFrame dianggap tidak terdefinisi maka! requestAnimationFrame akan benar dan satu lagi! itu akan salah
sumber
Beberapa operator dalam JavaScript melakukan konversi tipe implisit, dan terkadang digunakan untuk konversi tipe.
!
Operator unary mengubah operan menjadi boolean dan meniadakannya.Fakta ini mengarah pada idiom berikut yang dapat Anda lihat di kode sumber Anda:
sumber
Gunakan logika bukan operator dua kali
artinya! True = false
dan !! true = true
sumber
Mengembalikan nilai boolean suatu variabel.
Sebaliknya,
Boolean
kelas bisa digunakan.(baca deskripsi kode)
Yaitu,
Boolean(X) = !!X
sedang digunakan.Silakan periksa cuplikan kode di bawah ini ↓
sumber