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
falsesini: jsfiddle.net/8CKbd