Dalam javascript, apakah string kosong selalu salah sebagai boolean?

134

dalam javascript,

var a = '';
var b = (a) ? true : false;

var bakan diatur ke false.

Apakah ini perilaku yang dapat diandalkan?

cc muda
sumber
Apakah Anda yakin, saya akan ke falsesini: jsfiddle.net/8CKbd
anubhava
Saya melangkah lebih jauh. String dengan spasi benar. if ('') {console.log ('!')} tetapi '' == 0 benar.
Azat
2
Saya pikir edisi @JonH salah, string kosong ''dievaluasi menjadi false dalam konteks boolean jadi jika a = '';kemudian a ? false : true=> '' ? false : true=> false ? false : true=> true(karena evaluasi untuk nilai yang salah). Saya pikir itu harus var b = (a) ? true : false;benar dengan pernyataan berikutnya.
PhoneixS
@PhoneixS diedit, semoga lebih bermakna sekarang.
SwissCoder
1
@ SwissCoder bukan yang tidak dapat dibaca tetapi itu menghasilkan jawaban lain. Sekarang saya telah memperbaikinya.
PhoneixS

Jawaban:

191

Iya. Javascript adalah dialek ECMAScript, dan spesifikasi bahasa ECMAScript jelas mendefinisikan perilaku ini:

ToBoolean

Hasilnya salah jika argumennya adalah String kosong (panjangnya nol); jika tidak, hasilnya benar

Kutipan diambil dari http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

Arenielle
sumber
Aaaa dan sudah beres
Anthony
28
Satu peringatan adalah itu new String("")benar! Ini karena itu adalah objek, sedangkan bentuk pendek ""mewakili versi nilai primitif. Hal yang sama berlaku untuk new Number(0)dan bahkan new Boolean(false). Ini alasan yang baik untuk tidak menggunakan versi objek dalam kode Anda, dan itu berarti bahwa if (str.length)menangani kasus tepi ini sedangkan if (str)tidak.
Chris Middleton
54

Iya. Semua false, 0, string kosong ''dan "", NaN, undefined, dan nullselalu dievaluasi sebagai false; yang lainnya true.

Dan dalam contoh Anda, b adalah falsesetelah evaluasi. (Saya pikir Anda salah menulis true)

Hossein
sumber
2
nullbukan false, tidak true, nulladalah null. jsfiddle.net/sq1Lkpg0
Bruno Finger
7
@ Bruno, Anda dapat melakukan tes yang sama dengan NaNdan undefined. Mereka bukan falsetapi mereka salah. Itulah yang ditanyakan.
Joseph
11

var a = '';
var b = (a) ? false : true;   // fixed!
console.log(b);               // => true

var bakan diatur ke true.

Apakah ini perilaku yang dapat diandalkan?

Seperti menjawab di atas, ya , itu adalah perilaku yang didefinisikan dari string kosong dalam bersyarat (sebuah ifekspresi, ||, &&, ? :, ...). ( Standar mengatakan bahwa operasi internal ToBoolean harus diterapkan.)

Evaluasi berbeda ketika string kosong digunakan dalam perbandingan (lihat Kebenaran, Kesetaraan, dan JavaScript ), meskipun hasilnya sebagian besar sama :

// conditional (note: evaluation to false prints false here!)
console.log('' ? true : false); // zero length     => false

// comparisons
console.log('' == true);        // +0 === 1        => false
console.log('' == false);       // +0 === +0       => true
console.log('' === true);       // different types => false
console.log('' === false);      // different types => false

Penjelasan: Pada dasarnya, ketika operan ==memiliki jenis yang berbeda, JavaScript berusaha keras untuk mengubahnya menjadi Angka, sesuai dengan nilainya , ( menggunakan operasi panggilan standar ToNumber dan ToPrimitive ), dan kemudian berlaku secara internal ===. Tetapi ketika Anda menggunakan ===secara langsung, tipe tidak dikonversi, jadi selalu membandingkan String dengan Boolean false.

Secara kasar, uji JavaScript conditionals ( ToBoolean ) untuk nilai yang ditentukan, tidak nol, tidak nol, tidak kosong, tidak palsu (String kosong ... kosong, Angka -0 atau +0 adalah ... nol, NaN bukan angka yang ditentukan, tetapi Obyek kosong ternyata tidak benar-benar kosong), atau seperti yang saya suka pikirkan, uji kondisional untuk hal (benar) , sambil ==membandingkan nilai yang tampak, nilai yang dikonversi dengan cermat ( ToPrimitive , ToNumber ) dari operan, dan ===mencari kesamaan yang tepat .

if (X) {}        // is X a (true) thing?
if (X == Y) {}   // are the values of X and Y same-ish?
if (X === Y) {}  // are X and Y exactly the same?

Ada lebih banyak contoh di Kebenaran, Kesetaraan dan JavaScript di mana perbedaan ini benar-benar penting, misalnya '0'adalah truedalam bersyarat (non-nol panjang, atau, itu adalah hal ), tetapi falsedalam ==perbandingan (yang nilai adalah nol). '1'sekali lagi, truedalam kedua kasus (itu adalah hal dan memiliki nilai bukan nol).

console.log('' ? true : false);   // zero length     => false
console.log('' == true);          // +0 === 1        => false
console.log('0' ? true : false);  // non-zero length => true
console.log('0' == true);         // +0 === 1        => false
console.log('1' ? true : false);  // non-zero length => true
console.log('1' == true);         //  1 === 1        => true

Orafu
sumber
1
Pada awalnya saya berpikir, "pssh, itu berlebihan, ini sudah dijawab dengan baik." Tapi itu disajikan dengan baik dan informatif. Terima kasih.
Marc L.
8

var bakan diatur ke true. Ini karena string kosong dihitung sebagai nilai 'falsey' dalam JavaScript seperti halnya beberapa nilai lainnya.

Silakan lihat http://www.sitepoint.com/javascript-truthy-falsy/ untuk nilai falsy

Jonathon Bolster
sumber
Anda salah dalam jawaban Anda. var bsebenarnya akan diatur ke truekarena itu kebalikan dari var ajika Anda melihat kode.
bombek
@ Bombek Terima kasih - Aku akan marah. Sepertinya pertanyaan asli diedit setelah jawaban saya (nilai-nilai ditukar sekitar)
Jonathon Bolster
5

Contoh ekspresi yang dapat dikonversi menjadi false adalah mereka yang mengevaluasi ke nol, 0, string kosong (""), atau tidak terdefinisi. (lihat Referensi MDN )

Marcel Jackwerth
sumber