JavaScript: pusta tablica, [] zwraca prawdę w strukturach warunkowych. Dlaczego to?


100

Napotkałem wiele błędów w moim kodzie, ponieważ spodziewałem się tego wyrażenia:

Boolean([]); ocenić na fałsz.

Ale to nie był przypadek, jak ocenił jako prawdziwy.

Dlatego funkcje, które prawdopodobnie zwróciły w []ten sposób:

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

}else
{
  // ...
}

nie zrobił oczekiwanych rzeczy.

Czy mylę się, zakładając, że jest []to pusta tablica?

Czy to zachowanie jest spójne we wszystkich przeglądarkach? Czy też są tam jakieś pułapki? Nawiasem mówiąc, zaobserwowałem to zachowanie w Goolgle Chrome.


5
tablice są obiektami, obiekty są prawdziwe. po prostu zapytaj o array.length, jeśli nie zero, będzie zgodne z prawdą. kiedy jawnie konwertujesz na Boolean, tablica zamienia się najpierw w pusty ciąg, a następnie pusty ciąg zamienia się w fałsz.
dandavis

1
Dlaczego nie używasz myCollection.length > 0?
Steve

1
@Steve - to nie zadziała, jeśli myCollectiontak się stanie nulllub undefined. Musisz użyć if(myCollection && myCollection.length > 0).
Ted Hopp

@TedHopp - oczywiście ... Po prostu wskazałem, że myCollection.length > 0oferuje wartość logiczną, która robi to, o co prosił OP ... nadal musi wykonać pracę stamtąd.
Steve

Odpowiedzi:


119

Z http://www.sitepoint.com/javascript-truthy-falsy/

Następujące wartości są zawsze fałszywe:

  • fałszywy
  • 0 (zero)
  • "" (pusta struna)
  • zero
  • nieokreślony
  • NaN (specjalna wartość Number oznaczająca Not-a-Number!)

Wszystkie inne wartości są prawdziwe, w tym „0” (zero w cudzysłowie), „fałsz” (fałsz w cudzysłowie), puste funkcje, puste tablice i puste obiekty.

Jeśli chodzi o przyczynę , podejrzewam, że dzieje się tak dlatego, że tablice JavaScript są po prostu szczególnym typem obiektu. Specjalne traktowanie tablic wymagałoby dodatkowego obciążenia podczas testowania Array.isArray(). Ponadto prawdopodobnie byłoby mylące, gdyby prawdziwe tablice zachowywały się inaczej niż inne obiekty podobne do tablic w tym kontekście, podczas gdy sprawianie, że wszystkie obiekty podobne do tablic zachowują się tak samo, byłoby jeszcze droższe.


28
Jeśli przetestujesz wyrażenie, [] == falsektóre otrzyma true.
m.rufca


jest tam garść tabel pokazujących nieoczekiwane sytuacje za pomocą ==komparatora w opublikowanym przez Ciebie linku. Skomentowałem, żeby być ostrożnym, oczekując prawdziwej lub fałszywej oceny.
m.rufca

4
To tak naprawdę nie odpowiada na pytanie, dlaczego. Dlaczego pusta tablica jest prawdziwa, gdy pusty ciąg jest fałszywy? Jako świadoma decyzja projektowa wydaje się to bardzo złe.
Esa Lindqvist

1
Może dlatego, że są one potrzebne do działania jak prymitywne przedmioty. Ale JavaScript nie ma prymitywnych tablic.
Barmar

28

Powinieneś sprawdzić .lengthz tej tablicy, aby zobaczyć, czy zawiera jakieś elementy.

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

@marczellm Ten komentarz Steve'a jest nieaktualny, powiadomił DevIshOne o braku warunku „gdy tablica ma elementy” , który został poprawiony w edycji .
mucaho
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.