Semua nilai falsey dalam JavaScript

215

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.

user56reinstatemonica8
sumber
1
@tibos blog.stackoverflow.com/2011/07/...
user56reinstatemonica8
5
dorey.github.io/JavaScript-Equality-Table adalah sumber yang bagus dan memiliki if()tab untuk kebenaran.
cloudfeet
4
Wow, sangat berguna, terima kasih! [[]] == ""tapi [] != []? Kepalaku sakit ...
user56reinstatemonica8
Spesifikasi ECMA 262 merinci aturan perbandingan ini, khususnya bagian 11.9.1 hingga 11.9.6: ecma-international.org/ecma-262/5.1/#sec-11.9.3 Akan membengkak jika Anda memperbarui jawaban untuk menyertakan referensi ini , karena menyediakan aturan untuk bagaimana penentuan benar / salah (seharusnya) dibuat.
Shaun Wilson

Jawaban:

367

Nilai-nilai Falsey dalam JavaScript

"Falsey" berarti bahwa ToBooleanfungsi internal JavaScript kembali false. ToBooleanmendasari !value, value ? ... : ...;dan if (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, dan BigInt, disebutkan di atas:

Tidak terdefinisi: Kembalikan salah.  Null: Return false.  Boolean: Kembalikan argumen.  Nomor: Jika argumennya adalah +0, -0, atau NaN, return false;  jika tidak, kembalikan benar.  String: Jika argumen adalah String kosong (panjangnya nol), return false;  jika tidak, kembalikan benar.  BigInt: Jika argumen 0n, return false;  jika tidak, kembalikan benar.  Simbol: Kembali benar.  Objek: Mengembalikan nilai true.


Perbandingan dengan ==(kesetaraan longgar)

Ada baiknya berbicara tentang perbandingan longgar== nilai-nilai palsu , yang menggunakan ToNumber()dan dapat menyebabkan beberapa kebingungan karena perbedaan mendasar. Mereka secara efektif membentuk tiga kelompok:

  • false, 0, -0, "", '' semua cocok satu sama lain dengan ==
    • misalnya false == "", '' == 0dan karenanya4/2 - 2 == 'some string'.slice(11);
  • null, undefined cocok dengan ==
    • misalnya null == undefinedtetapiundefined != false
    • Ini juga layak disebutkan bahwa sementara typeof nullpengembalian 'object', nulladalah 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.allketika Javascript diimplementasikan dalam HTML)
  • NaN tidak cocok dengan apa pun, dengan ==atau ===, bahkan tidak sendiri
    • misalnya NaN != NaN, NaN !== NaN, NaN != false,NaN != null

Dengan "kesetaraan ketat" ( ===), tidak ada pengelompokan seperti itu. Hanya false === 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 ToBooleanfungsi internal JavaScript kembali true. Sebuah kekhasan Javascript yang harus diperhatikan (dan alasan bagus lainnya untuk memilih ===lebih ==): adalah mungkin bagi suatu nilai untuk menjadi benar ( ToBooleankembali true), 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 (misalnya 42 == "42"). Sejak 0 == false, jika "0" == 0, "0" == false.
  • new Number(0)dan new Boolean(false)- mereka objek, yang benar, tetapi ==melihat nilai-nilai mereka, yang == false.
  • 0 .toExponential(); - objek dengan nilai numerik yang setara dengan 0
  • Konstruksi serupa apa pun yang memberi Anda nilai penyetaraan salah yang dibungkus dengan jenis yang benar
  • [], [[]]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 spasi
  • Apa pun dari typeof, yang selalu mengembalikan string yang tidak kosong, misalnya:

  • Objek apa pun (kecuali "pelanggaran yang disengaja" document.alldi browser; ingatlah bahwa nullitu sebenarnya bukan objek meskipun typeofmenyarankan sebaliknya). Termasuk:

    • {}
    • []
    • function(){}atau () => {}(fungsi apa pun, termasuk fungsi kosong)
    • Error dan contoh dari Error
    • Ekspresi reguler apa pun
    • Apa pun yang dibuat dengan new(termasuk new Number(0)dan new Boolean(false))
  • setiap Symbol

true, 1, "1"Dan [1]kembali truebila dibandingkan dengan satu sama lain dengan ==.

user56reinstatemonica8
sumber
3
FYI, apa !, ifdan ?..:memiliki kesamaan adalah bahwa mereka menyebut ToBooleanfungsi 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 adalah false, tapi dengan !!, itu true" , tetapi tidak memahami konsep yang mendasari. Dua poin lainnya: 1) v ? true : falsehanyalah cara verbose !!v. 2) typeof selalu mengembalikan string yang tidak kosong, yang benar.
Felix Kling
1
Yaitu tidak ada gunanya melihat typeof nullatau typeof undefinedsecara khusus. Anda bisa mengatakan bahwa string yang tidak kosong adalah benar.
Felix Kling
1
Saya mengerti, tetapi ini tidak ada hubungannya dengan pertanyaan awal;) Menambahkan terlalu banyak hal yang berkaitan tetapi informasi yang tidak relevan bisa agak membingungkan bagi pembaca.
Felix Kling
5
Saya baru saja belajar bahwa document.allitu palsu juga.
Claudiu
3
Mengenai perbandingan longgar: karena Boolean dikonversi ke angka, x == falseakan memanggil ToNumber(x)yang hanya sangat berbeda dari ToBoolean(x). Mungkin perlu dijelaskan. Saya juga baru memperhatikan bahwa saya sudah mengomentari jawaban ini berabad-abad yang lalu: D
Felix Kling
3

Jangan lupa tentang string kosong "false"yang dievaluasitrue

MrMcPlad
sumber
8
... dan karena itu bukan nilai yang salah, yang diminta?
Bergi
5
sentuhan. ini adalah nilai yang Anda harapkan menjadi falsey dan bukan, yang masih layak disadari, dan saya pikir, pantas disebutkan dalam daftar komprehensif
MrMcPlad
4
Ditambahkan ke daftar ... tetapi jangan mencoba mengubahnya menjadi daftar komprehensif dari semua nilai kebenaran yang mungkin! Itu akan memakan waktu cukup lama:-)
user56reinstatemonica8
3

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.

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    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:

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }   
    else {
        console.log('I am a falsy value');
    }

    Potongan kode di atas dicetak lagi I am a falsy value.

RBT
sumber
7
JavaScript tidak memiliki angka integer. 0, 0x0, 0.0Dan 0.00yang literal hanya berbeda untuk IEEE-754 64-bit floating point nilai nol yang sama.
fredoverflow
1

Selain topik, pada ES2020 kami memiliki nilai baru yang falsy, ini adalah BigInt zero (0n):

0n == false // true
-0n == false // true

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).

GetMeARemoteJob
sumber
1
Bagus! Terima kasih, saya belum pernah mendengar tentang itu, saya telah menambahkannya ke daftar besar dengan tautan mengkredit jawaban Anda untuk meningkatkannya
user56reinstatemonica8