var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
var b
akan 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 if
ekspresi, ||
, &&
, ? :
, ...). ( 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 true
dalam bersyarat (non-nol panjang, atau, itu adalah hal ), tetapi false
dalam ==
perbandingan (yang nilai adalah nol). '1'
sekali lagi, true
dalam 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
false
sini: jsfiddle.net/8CKbd