JavaScript: boş dizi, [] koşullu yapılarda doğru olarak değerlendirilir. Bu neden?


101

Kodumda birçok hata ile karşılaşıyordum çünkü şu ifadeyi bekliyordum:

Boolean([]); yanlış olarak değerlendirmek.

Ancak doğru olarak değerlendirildiği gibi durum böyle değildi.

Bu nedenle, muhtemelen şu şekilde döndürülen işlevler []:

// Where myCollection possibly returned [ obj1, obj2, obj3] or []
if(myCollection)
{
  // ...

}else
{
  // ...
}

beklenmedik şeyler yapmadı.

Bunun []boş bir dizi olduğunu varsaymakla yanılıyor muyum ?

Ayrıca, bu davranış tüm tarayıcılarda tutarlı mı? Yoksa orada da herhangi bir sorun var mı? Bu davranışı Goolgle Chrome'da da gözlemledim.


5
diziler nesnelerdir, nesneler doğrudur. sadece array.length isteyin, sıfır değilse, doğru olacaktır. açıkça Boolean'a dönüştürdüğünüzde, dizi önce boş bir dizeye, ardından boş dizge yanlışa dönüşür.
dandavis

1
Neden kullanmayın myCollection.length > 0?
Steve

1
@Steve - ya da myCollectionolursa işe yaramaz . Kullanmanız gerekiyor . nullundefinedif(myCollection && myCollection.length > 0)
Ted Hopp

@TedHopp - tabii ki ... Sadece myCollection.length > 0OP'nin istediği şeyi yapan bir boole değeri sunduğuna işaret ediyordum ... işi oradan yapması gerekiyor.
Steve

Yanıtlar:


120

Gönderen http://www.sitepoint.com/javascript-truthy-falsy/

Aşağıdaki değerler her zaman yanlıştır:

  • yanlış
  • 0 (sıfır)
  • "" (boş dize)
  • boş
  • Tanımsız
  • NaN (Sayı Değil anlamına gelen özel bir Sayı değeri!)

"0" (tırnak içinde sıfır), "yanlış" (tırnak içinde yanlış), boş işlevler, boş diziler ve boş nesneler dahil olmak üzere diğer tüm değerler doğrudur.

Bunun neden böyle olduğuna gelince , JavaScript dizilerinin sadece belirli bir nesne türü olduğundan şüpheleniyorum. Dizileri özel olarak işlemek, test etmek için fazladan ek yük gerektirir Array.isArray(). Ayrıca, gerçek dizilerin bu bağlamda diğer dizi benzeri nesnelerden farklı davranması kafa karıştırıcı olurken, tüm dizi benzeri nesnelerin aynı şekilde davranmasını sağlamak daha da pahalı olacaktır.


28
İfadeyi test ederseniz, [] == falsedeğerlendirilir true.
m.rufca


Gönderdiğiniz ==bağlantıda karşılaştırıcıyı kullanarak beklenmedik durumları gösteren bir avuç tablo var . Doğru veya yanlış değerlendirme beklerken dikkatli olmak için yorum yaptım.
m.rufca

4
Bu, NEDEN olan soruyu gerçekten cevaplamıyor. Boş bir dizge yanlışsa neden boş bir dizi doğrudur? Kasıtlı bir tasarım kararı olarak bu çok kötü hissettiriyor.
Esa Lindqvist

1
Belki, çünkü bunların ilkel nesneler gibi davranması gerekiyor. Ancak Javascript ilkel dizilere sahip değildir.
Barmar

28

.lengthHerhangi bir öğe içerip içermediğini görmek için o diziyi kontrol etmelisiniz .

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)

@marczellm Steve'in bu yorumu güncelliğini yitirdi, DevIshOne'a "dizi elemanlara sahip olduğunda" eksik koşulu bildirdi , bu nedenle düzenleme sırasında düzeltildi .
mucaho
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.