JavaScript'te boş bir dize, boole olarak her zaman yanlış mıdır?


134

javascript'te

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

var bolarak ayarlanacak false.

Bu güvenilebilecek tanımlanmış bir davranış mı?


Emin misin, falseburaya geliyorum
anubhava

Bir adım daha ileri götürdüm. Boşluklu dizge doğrudur. eğer ('') {console.log ('!')} ama '' == 0 doğrudur.
Azat

2
@JonH baskısının yanlış olduğunu düşünüyorum, ''boole bağlamında boş dizge yanlış olarak değerlendirilir, yani eğer a = '';o zaman a ? false : true=> '' ? false : true=> false ? false : true=> true(çünkü yanlış bir değer için değerlendirme). Bir var b = (a) ? true : false;sonraki ifadeyle doğru olması gerektiğini düşünüyorum .
PhoneixS

@PhoneixS düzenlendi, umarım şimdi daha anlamlı olur.
SwissCoder

1
@SwissCoder bu okunabilir değil ama başka bir cevap veriyor. Şimdi düzelttim.
PhoneixS

Yanıtlar:


191

Evet. Javascript, ECMAScript'in bir lehçesidir ve ECMAScript dil belirtimi bu davranışı açıkça tanımlar:

ToBoolean

Bağımsız değişken boş String ise (uzunluğu sıfır) sonuç yanlıştır; aksi takdirde sonuç doğrudur

Alıntı http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf adresinden alınmıştır.


Aaaa ve halloldu
Anthony

28
Bir uyarı, bu new String("")doğru! Bunun nedeni, bir nesne olmasıdır, oysa kısa biçim "", ilkel değer sürümünü temsil eder. Aynısı için new Number(0)ve hatta new Boolean(false). Bu, kodunuzda nesne sürümlerini kullanmamanız için iyi bir nedendir ve bu, if (str.length)bu uç durumu ele alırken if (str)yapmayacağı anlamına gelir.
Chris Middleton

54

Evet. Tüm false, 0boş dizeleri ''ve "", NaN, undefined, ve nullher zaman olduğu gibi değerlendirilir false; diğer her şeytrue .

Ve sizin örneğinizde, b falsedeğerlendirmeden sonra. (Yanlış yazdığını düşünüyorum true)


2
nulldeğil false, ne true, nullolduğunu null. jsfiddle.net/sq1Lkpg0
Bruno Finger

7
@Bruno, aynı testi NaNve ile yapabilirsiniz undefined. Değiller falseama sahtedirler. Hangisi soruldu.
Joseph

11

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


1
İlk başta "pssh, bu çok fazla, bu zaten iyi yanıtlandı" diye düşündüm. Ancak bu iyi sunulmuş ve bilgilendiriciydi. Teşekkürler.
Marc L.

8

var b ayarlanacak true . Bunun nedeni, boş bir dizenin, diğer bazı değerler gibi JavaScript'te bir 'falsey' değeri olarak sayılmasıdır.

Yanlış değerler için lütfen http://www.sitepoint.com/javascript-truthy-falsy/ adresine bakın


Cevabınızda yanılıyorsunuz. var baslında olarak ayarlanacaktır trueçünkü var akoda bakarsanız bunun tam tersi olur.
bombek

@bombek Teşekkürler - yükselteceğim. Görünüşe göre orijinal soru cevabımdan sonra düzenlendi (değerler değiş tokuş edildi)
Jonathon Bolster

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.