JavaScript: array vazio, [] avalia como verdadeiro em estruturas condicionais. Por que é isso?

94

Encontrei muitos bugs no meu código porque esperava esta expressão:

Boolean([]); para avaliar como falso.

Mas este não foi o caso, pois foi avaliado como verdadeiro.

Portanto, funções que possivelmente retornaram []assim:

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

}else
{
  // ...
}

não fez as coisas esperadas.

Estou enganado ao supor que é []uma matriz vazia?

Além disso, esse comportamento é consistente em todos os navegadores? Ou há alguma pegadinha lá também? Observei esse comportamento no Goolgle Chrome, aliás.

racl101
fonte
5
arrays são objetos, os objetos são verdadeiros. basta pedir array.length, se não for zero, será verdade. quando você converte explicitamente para booleano, a matriz se transforma em uma string vazia primeiro e, em seguida, a string vazia se transforma em falsa.
dandavis,
1
Por que você não usa myCollection.length > 0?
Steve,
1
@Steve - isso não funcionará se myCollectionfor nullou undefined. Você precisa usar if(myCollection && myCollection.length > 0).
Ted Hopp,
@TedHopp - claro ... Eu estava apenas apontando que myCollection.length > 0oferece um valor booleano que está fazendo o que o OP pediu ... ele ainda precisa fazer o trabalho a partir daí.
Steve,
3
possível duplicata da matriz vazia
bummi

Respostas:

108

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

Os seguintes valores são sempre falsos:

  • falso
  • 0 (zero)
  • "" (string vazia)
  • nulo
  • Indefinido
  • NaN (um valor numérico especial que significa Não é um número!)

Todos os outros valores são verdadeiros, incluindo "0" (zero entre aspas), "falso" (falso entre aspas), funções vazias, matrizes vazias e objetos vazios.

Barmar
fonte
25
Se você testar a expressão, [] == falseela avalia para true.
m.rufca
3
@ m.rufca Consulte stackoverflow.com/questions/5491605/…
Barmar
há uma pequena tabela mostrando situações inesperadas usando o ==comparador no link que você postou. Comentei apenas para ter cuidado ao esperar avaliação verdadeira ou falsa.
m.rufca
4
Isso realmente não responde à pergunta, que era POR QUÊ. Por que um array vazio é verdadeiro, quando uma string vazia é falsa? Como uma decisão de design deliberada, isso parece muito ruim.
Esa Lindqvist
1
Talvez, porque esses são obrigados a agir como os objetos primitivos. Mas o Javascript não possui matrizes primitivas.
Barmar de
23

Você deve verificar o .lengthdesse array para ver se ele contém algum elemento.

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)
DevlshOne
fonte
@marczellm Esse comentário de Steve está desatualizado, ele notificou DevIshOne sobre a condição ausente "quando o array tem elementos" , que foi corrigido na edição .
mucaho