Nilai palsu vs string kosong, tidak terdefinisi, atau kosong


11

Saya telah bekerja dengan jQuery selama bertahun-tahun. Namun, baru-baru ini, saya menemukan diri saya semakin dalam ke bahasa JavaScript. Baru-baru ini, saya telah mendengar tentang nilai-nilai "kebenaran" dan falsey. Namun, saya tidak sepenuhnya memahaminya. Saat ini, saya memiliki beberapa kode yang terlihat seperti ini:

var fields = options.fields || ['id', 'query'];

Saya perlu mengidentifikasi apakah bidang adalah nol, tidak terdefinisi, atau memiliki panjang 0. Saya tahu jalan panjang yang harus dilakukan:

if ((fields === null) || (fields === undefined) || (fields.length === 0)) {
 ...                    
}

Pertanyaan saya adalah, apakah yang berikut ini sama:

if (!fields)  {
 ...
}

Jawaban:


23

Dalam pemrograman, kebenaran atau kepalsuan adalah kualitas dari ekspresi boolean yang tidak menyelesaikan ke nilai boolean yang sebenarnya, tetapi yang bagaimanapun ditafsirkan sebagai hasil boolean.

Dalam kasus C, ekspresi apa pun yang mengevaluasi ke nol ditafsirkan salah. Di Javascript, ekspresi valuedalam

if(value) {
}

akan mengevaluasi true jika valuetidak:

null
undefined
NaN
empty string ("")
0
false

Lihat Juga
Apakah ada fungsi standar untuk memeriksa variabel nol, tidak terdefinisi, atau kosong dalam JavaScript?


9

Himpunan nilai "truey" dan "falsey" dalam JavaScript berasal dari ToBooleanoperasi abstrak yang didefinisikan dalam spesifikasi ECMAScript , yang digunakan saat memaksa nilai ke boolean:

+--------------------------------------------------------------------------+
| Argument Type | Result                                                   |
|---------------+----------------------------------------------------------|
| Undefined     | false                                                    |
|---------------+----------------------------------------------------------|
| Null          | false                                                    |
|---------------+----------------------------------------------------------|
| Boolean       | The result equals the input argument (no conversion).    |
|---------------+----------------------------------------------------------|
| Number        | The result is false if the argument is +0, 0, or NaN;   |
|               | otherwise the result is true.                            |
|---------------+----------------------------------------------------------|
| String        | The result is false if the argument is the empty String  |
|               | (its length is zero); otherwise the result is true.      |
|---------------+----------------------------------------------------------|
| Object        | true                                                     |
+--------------------------------------------------------------------------+

Dari tabel ini, kita bisa melihat itu nulldan undefinedkeduanya dipaksa falsedalam konteks boolean. Namun, fields.length === 0umumnya Anda tidak memetakan ke nilai yang salah. Jika fields.lengthstring, maka akan diperlakukan sebagai false(karena string panjang nol adalah false), tetapi jika itu adalah objek (termasuk array) ia akan memaksa true.

Jika fieldsharus berupa string, maka !fieldsmerupakan predikat yang cukup. Jika fieldsarray, cek terbaik Anda mungkin:

if (!fields || fields.length === 0)

2

Jawaban singkat:

Tidak , mereka tidak sama.

Tapi ini:

if (!fields) { ... }

Apakah sama dengan ini:

if ((fields === null) || (fields === undefined) || (fields === 0) || (fields === '') || (fields === NaN) || (fields === flase)) { ...
}

Panjang (dan lebih baik) Jawaban:

Pertama mari kita bicara tentang nilai-nilai yang benar dan salah.

Ini semua tentang apa yang terjadi ketika Anda mengevaluasi sesuatu sebagai boolean. Dalam JavaScript, ini terjadi ketika Anda menggunakan hal-hal seperti ifpernyataan; operator logika seperti ||, !atau &&; atau Boolean()fungsinya.

The Boolean()fungsi menerima nilai dan kembali baik trueatau false.

Sebagai contoh:

var age = 1; // Let's evaluate age as a boolean Boolean(age); // true

Silakan dan coba ini di node repl.

Boolean hanya bisa trueatau false, jadi nilai balik Boolean() harus berupa trueatau false. Dalam hal ini, kami memberikan nilai 1, dan ketika dievaluasi sebagai boolean, 1adalah true.

Penting: Ketika dievaluasi sebagai boolean, nilai harus benar atau salah. Hanya itulah dua opsi.

Dalam JavaScript, hanya ada 6 nilai falsy. Nilai itu akan falseketika dievaluasi sebagai boolean. Mereka adalah: false, 0, "", null, undefined, dan NaN. Jadi jika salah satu dari nilai-nilai ini dievaluasi sebagai boolean, mereka akan salah:

Boolean(false) // false Boolean(0) // false Boolean("") // false Boolean(null) // false Boolean(undefined) // false Boolean(NaN) // false

Ini berarti bahwa nilai lainnya, dalam JavaScript, akan trueketika dievaluasi sebagai boolean. Jadi setiap nilai lain dalam JavaScript adalah benar.

Cara mudah lain untuk mengevaluasi sesuatu booleanadalah dengan menggunakan !operator. Sama seperti Booleanfungsi, ini mengevaluasi nilai sebagai boolean. Tetapi nilai-nilai kebenaran menjadi falsedan nilai-nilai palsu menjadi true.

!false // true !0 // true !"" / true !null // true !undefined // true !NaN // true

Sekali lagi, coba ini dalam simpul pengganti atau sesuatu untuk memastikan Anda mengerti.

Jadi pernyataan ini:

if (!fields) { ... }

Mengatakan sebagai berikut: "jika fields, ketika dievaluasi sebagai boolean, salah, maka jalankan kode di dalam pernyataan if ini."

Adapun pernyataan pertama Anda:

var fields = options.fields || ['id', 'query'];

Anda bekerja dengan operator OR logis, yang layak dibaca untuk memastikan bahwa Anda mengerti. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Logical_Operators


0

Kode Anda berarti:

var fields;
if (options.fields)
    fields = options.fields;
else
    fields = ['id', 'query'];

Sekarang options.fieldsdikonversi ke nilai boolean. Menurut definisi null, undefined, 0, ""diubah menjadi false, (kebanyakan) apa pun diubah menjadi true(tapi saya tidak ingin menjadi begitu tepat).

Itu tidak berarti sama, karena fields.length === 0garis. Array kosong dan objek lainnya dikonversi ke true.

Catatan: Javascript kadang-kadang berantakan besar ... Misalnya tidak ada kebutuhan nyata untuk 2 operator pengecekan tipe (typeof dan instanceof). Itu hanya membingungkan ppl ketika true instanceof Booleantidak bekerja dan menggunakan typeof(true) == "boolean"rentan kesalahan karena mengetikkan string tanpa pelengkapan otomatis. Mungkin di beberapa versi baru masalah ini akan terpecahkan.


-1

Anda dapat mencoba (!! bidang) jika elemen bidang adalah nol, tidak terdefinisi atau memiliki panjang 0 maka akan mengembalikan true. Atau (!!! bidang) maka ini akan mengembalikan true.

ganda! atau !! akan memaksa benar atau salah. Saya berharap dapat menemukan definisi yang baik untuk ini, tetapi saya sepertinya tidak dapat menemukannya lagi.


1
"!!!" sama dengan "!" menurut definisi, seperti "!!!!!" dan "!!!!!!!". "Notting" nilai dapat digunakan untuk mengkonfirmasi bahwa ada sesuatu yang benar atau salah, yang pasti memiliki tempatnya, tetapi tidak sepenuhnya menjawab pertanyaan OP. Artinya, apa sebenarnya nilai-nilai yang benar atau salah?
Jeffrey Sweeney

Saya menemukan sebuah artikel yang lebih baik menggambarkan bukan operator: bennadel.com/blog/... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…. Ini akan mengubah kondisi Anda menjadi nilai boolean.
Randy Collier
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.