var a = '';
var b = (a) ? false : true; // fixed!
console.log(b); // => true
değişken bayarlanacaktrue .
Bu güvenilebilecek tanımlanmış bir davranış mı?
Yukarıda cevap olarak, evet , yani boş dize tanımlanan davranıştır bir koşullu içinde (bir ififadenin, ||, &&, ? :, ...). ( Standart , dahili ToBoolean işleminin uygulanması gerektiğini söyler .)
Sonuçlar çoğunlukla aynı olsa da, bir karşılaştırmada boş dize kullanıldığında değerlendirme farklıdır (bkz. Gerçek, Eşitlik ve JavaScript ) :
// 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
Açıklama: Esasen, işlenenlerin ==farklı türleri olduğunda, JavaScript, değerlerine göre ( standart ToNumber ve ToPrimitive çağrılarını kullanan işlemleri kullanarak) bunları Numbers'a dönüştürmeye çalışır ve sonra dahili olarak uygulanır . Ancak doğrudan kullandığınızda , türler dönüştürülmez, bu nedenle bir String ile Boolean'ı karşılaştırmak her zaman olur .======false
Kabaca konuşursak, JavaScript koşulluları ( ToBoolean ) tanımlanmış, boş olmayan, sıfır olmayan, boş olmayan, yanlış olmayan bir değer için test eder (boş bir Dize ... boştur, Sayılar -0 veya +0 ... sıfır, NaN tanımlı bir sayı değildir, ancak boş bir Nesne görünüşe göre gerçekten boş değildir) veya düşünmek istediğim gibi, koşul ifadeleri (doğru) bir şeyi test ederken ==, görünür, dikkatlice dönüştürülmüş değerleri ( ToPrimitive , ToNumber ) işlenenleri ve tam aynılığı=== arar .
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?
Orada daha örneklerdir Doğruluk, Eşitlik ve JavaScript gibi bu ayrım gerçekten önemli, '0'olan truebir koşullu içinde (sıfır olmayan uzunlukta veya bir şeydir ), ama falsebir de ==karşılaştırma ( değer sıfırdır). '1'yine, trueher iki durumda da (bir şeydir ve sıfır olmayan bir değere sahiptir).
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
falseburaya geliyorum