Apa nilai-nilai dalam JavaScript yang 'falsey' , yang berarti bahwa mereka menilai sebagai salah dalam ekspresi seperti if(value)
, value ?
dan !value
?
Ada beberapa diskusi tentang tujuan nilai falsey di Stack Overflow , tetapi tidak ada jawaban lengkap yang mencantumkan semua nilai falsey itu.
Saya tidak dapat menemukan daftar lengkap tentang Referensi JavaScript MDN , dan saya terkejut menemukan bahwa hasil teratas ketika mencari daftar lengkap, nilai-nilai falsey otoritatif dalam JavaScript adalah artikel blog, beberapa di antaranya memiliki penghilangan yang jelas (misalnya, NaN
), dan tidak ada yang memiliki format seperti Stack Overflow di mana komentar atau jawaban alternatif dapat ditambahkan untuk menunjukkan keanehan, kejutan, kelalaian, kesalahan atau peringatan. Jadi, sepertinya masuk akal untuk membuatnya.
sumber
if()
tab untuk kebenaran.[[]] == ""
tapi[] != []
? Kepalaku sakit ...Jawaban:
Nilai-nilai Falsey dalam JavaScript
false
Number
jenis:0
dan juga-0
,0.0
, dan bentuk hex0x0
( berkat RBT )BigInt
jenis:0n
dan-0n
(baru pada tahun 2020, berkat GetMeARemoteJob )""
,''
dan``
- string dengan panjang 0null
undefined
NaN
document.all
(hanya di browser HTML)document.all
adalah objek falsey, dengantypeof
asundefined
. Itu adalah fungsi Microsoft-proprietory di IE sebelum IE11, dan telah ditambahkan ke spesifikasi HTML sebagai "pelanggaran yang disengaja dari spesifikasi JavaScript" sehingga situs yang ditulis untuk IE tidak akan berhenti mencoba mengakses, misalnyadocument.all.something
,; itu salah karenaif (document.all)
dulu cara populer untuk mendeteksi IE, sebelum komentar bersyarat. Lihat Mengapa document.all falsy? untuk detail"Falsey" berarti bahwa
ToBoolean
fungsi internal JavaScript kembalifalse
.ToBoolean
mendasari!value
,value ? ... : ...;
danif (value)
. Berikut spesifikasi resminya (draft kerja 2020) (satu-satunya perubahan sejak spesifikasi skrip ECMA pertama pada tahun 1997 adalah penambahan simbol ES6 , yang selalu benar, danBigInt
, disebutkan di atas:Perbandingan dengan
==
(kesetaraan longgar)Ada baiknya berbicara tentang perbandingan longgar
==
nilai-nilai palsu , yang menggunakanToNumber()
dan dapat menyebabkan beberapa kebingungan karena perbedaan mendasar. Mereka secara efektif membentuk tiga kelompok:false, 0, -0, "", ''
semua cocok satu sama lain dengan==
false == ""
,'' == 0
dan karenanya4/2 - 2 == 'some string'.slice(11);
null, undefined
cocok dengan==
null == undefined
tetapiundefined != false
typeof null
pengembalian'object'
,null
adalah bukan obyek, ini adalah bug lama / permainan kata-kata yang tidak tetap untuk mempertahankan kompatibilitas. Ini bukan objek yang benar, dan objek itu benar (kecuali untuk "pelanggaran yang disengaja"document.all
ketika Javascript diimplementasikan dalam HTML)NaN
tidak cocok dengan apa pun, dengan==
atau===
, bahkan tidak sendiriNaN != NaN
,NaN !== NaN
,NaN != false
,NaN != null
Dengan "kesetaraan ketat" (
===
), tidak ada pengelompokan seperti itu. Hanyafalse
===
false
.Ini adalah salah satu alasan mengapa banyak pengembang dan banyak panduan gaya (misalnya standardjs ) lebih suka
===
dan hampir tidak pernah menggunakannya==
.Nilai sebenarnya itu sebenarnya
== false
"Truthy" berarti
ToBoolean
fungsi internal JavaScript kembalitrue
. Sebuah kekhasan Javascript yang harus diperhatikan (dan alasan bagus lainnya untuk memilih===
lebih==
): adalah mungkin bagi suatu nilai untuk menjadi benar (ToBoolean
kembalitrue
), tetapi juga== false
.Anda mungkin berpikir
if (value && value == false) alert('Huh?')
adalah ketidakmungkinan logis yang tidak bisa terjadi, tetapi itu akan, untuk:"0"
dan'0'
- mereka adalah string yang tidak kosong, yang benar, tetapi Javascript==
mencocokkan angka dengan string yang setara (misalnya42 == "42"
). Sejak0 == false
, jika"0" == 0
,"0" == false
.new Number(0)
dannew Boolean(false)
- mereka objek, yang benar, tetapi==
melihat nilai-nilai mereka, yang== false
.0 .toExponential();
- objek dengan nilai numerik yang setara dengan0
[]
,[[]]
dan[0]
(terima kasih cloudfeet untuk tautan Tabel Kesetaraan JavaScript )Beberapa nilai lebih jujur
Ini hanya beberapa nilai yang mungkin diharapkan sebagian orang sebagai falsey, tetapi sebenarnya adalah kebenaran.
-1
dan semua angka negatif bukan nol' '
," "
,"false"
,'null'
... semua string yang tidak kosong, termasuk string yang hanya spasiApa pun dari
typeof
, yang selalu mengembalikan string yang tidak kosong, misalnya:typeof null
(mengembalikan string'object'
karena bug / kekhasan yang sudah berlangsung lama )typeof undefined
(mengembalikan string'undefined'
)Objek apa pun (kecuali "pelanggaran yang disengaja"
document.all
di browser; ingatlah bahwanull
itu sebenarnya bukan objek meskipuntypeof
menyarankan sebaliknya). Termasuk:{}
[]
function(){}
atau() => {}
(fungsi apa pun, termasuk fungsi kosong)Error
dan contoh dariError
new
(termasuknew Number(0)
dannew Boolean(false)
)true
,1
,"1"
Dan[1]
kembalitrue
bila dibandingkan dengan satu sama lain dengan==
.sumber
!
,if
dan?..:
memiliki kesamaan adalah bahwa mereka menyebutToBoolean
fungsi internal pada nilai. Bagaimana nilai-nilai berperilaku dalam konteks!
,if
, dll sudah tersirat dengan nama mereka: Mereka adalah "falsy" nilai-nilai. Aku agak takut bahwa orang lain akan membaca jawaban dan berpikir "Oh begitu dalam konteks ini (!
,if
,?...:
), nilai adalahfalse
, tapi dengan!!
, itutrue
" , tetapi tidak memahami konsep yang mendasari. Dua poin lainnya: 1)v ? true : false
hanyalah cara verbose!!v
. 2)typeof
selalu mengembalikan string yang tidak kosong, yang benar.typeof null
atautypeof undefined
secara khusus. Anda bisa mengatakan bahwa string yang tidak kosong adalah benar.document.all
itu palsu juga.x == false
akan memanggilToNumber(x)
yang hanya sangat berbeda dariToBoolean(x)
. Mungkin perlu dijelaskan. Saya juga baru memperhatikan bahwa saya sudah mengomentari jawaban ini berabad-abad yang lalu: DJangan lupa tentang string kosong
"false"
yang dievaluasitrue
sumber
:-)
Hanya untuk menambahkan ke daftar nilai falsy @ user568458:
Selain bilangan bulat 0, angka desimal 0,0, 0,00 atau angka nol seperti itu juga merupakan nilai palsu.
Cetak snipet kode di atas
I am a falsy value
Demikian pula representasi hex dari angka 0 juga merupakan nilai palsu seperti yang ditunjukkan dalam cuplikan kode di bawah ini:
Potongan kode di atas dicetak lagi
I am a falsy value
.sumber
0
,0x0
,0.0
Dan0.00
yang literal hanya berbeda untuk IEEE-754 64-bit floating point nilai nol yang sama.Selain topik, pada ES2020 kami memiliki nilai baru yang falsy, ini adalah BigInt zero (0n):
Jadi dengan ini, kita sekarang memiliki 7 nilai "falsy" secara total (tidak termasuk document.all seperti yang disebutkan oleh pengguna di atas karena ini merupakan bagian dari DOM dan bukan JS).
sumber