Valores de Falsey em JavaScript
false
- Zero de
Numbertipo: 0e também -0, 0.0e forma hexagonal 0x0( graças RBT )
- Zero do
BigInttipo: 0ne -0n(novo em 2020, obrigado GetMeARemoteJob )
"", ''e ``- cadeias de comprimento 0
null
undefined
NaN
document.all (apenas em navegadores HTML)
"Falsey" significa simplesmente que a ToBooleanfunção interna do JavaScript retorna false. ToBooleansubjaz !value, value ? ... : ...;e if (value). Aqui está sua especificação oficial (esboço de trabalho para 2020) (as únicas alterações desde a primeira especificação ECMAscript em 1997 são a adição dos símbolos do ES6 , que são sempre verdadeiros e BigIntmencionados acima:

Comparações com ==(igualdade solta)
Vale a pena falar das comparações frouxas== dos valores falsos , que usam ToNumber()e podem causar alguma confusão devido às diferenças subjacentes. Eles formam efetivamente três grupos:
false, 0, -0, "", '' todos combinam com ==
- por exemplo
false == "", '' == 0e portanto4/2 - 2 == 'some string'.slice(11);
null, undefined combina com ==
- por exemplo,
null == undefinedmasundefined != false
- Também vale a pena mencionar que, enquanto
typeof nullretornos 'object', nullé não um objeto, este é um longa data bug / peculiaridade que não foi fixado, a fim de manter a compatibilidade. Não é um objeto verdadeiro, e os objetos são verdadeiros (exceto a "violação intencional" document.allquando o Javascript é implementado em HTML)
NaN não corresponde a nada, com ==ou ===, nem mesmo a si próprio
- por exemplo
NaN != NaN, NaN !== NaN, NaN != false,NaN != null
Com "igualdade estrita" ( ===), não existem tais agrupamentos. Só false === false.
Essa é uma das razões pelas quais muitos desenvolvedores e muitos guias de estilo (por exemplo, standardjs ) preferem ===e quase nunca usam ==.
Valores reais que realmente == false
"Verdade" significa simplesmente que a ToBooleanfunção interna do JavaScript retorna true. Um capricho do Javascript estar ciente de (e outra boa razão para preferir ===mais ==): é possível para um valor a ser truthy ( ToBooleanretornos true), mas também == false.
Você pode pensar que if (value && value == false) alert('Huh?')é uma impossibilidade lógica que não poderia acontecer, mas ocorrerá por:
"0"e '0'- são strings não vazias, que são verdadeiras, mas o Javascript ==combina números com strings equivalentes (por exemplo 42 == "42"). Desde 0 == false, se "0" == 0, "0" == false.
new Number(0)e new Boolean(false)- são objetos que são verdadeiros, mas ==vêem seus valores, quais == false.
0 .toExponential(); - um objeto com um valor numérico equivalente a 0
- Quaisquer construções semelhantes que fornecem um valor de igual falso envolvido em um tipo verdadeiro
[], [[]]e [0](obrigado cloudfeet pelo link JavaScript Equality Table )
Alguns valores mais verdadeiros
Esses são apenas alguns valores que algumas pessoas podem esperar ser falsey, mas são realmente verdadeiros.
-1 e todos os números negativos diferentes de zero
' ', " ", "false", 'null'... todas as cadeias não vazias, incluindo cordas que são apenas espaços em branco
Qualquer coisa de typeof, que sempre retorna uma string não vazia, por exemplo:
Qualquer objeto (exceto a "violação intencional" document.allnos navegadores; lembre-se de que nullnão é realmente um objeto, apesar de typeofsugerir o contrário). Incluindo:
{}
[]
function(){}ou () => {}(qualquer função, incluindo funções vazias)
Error e qualquer instância de Error
- Qualquer expressão regular
- Qualquer coisa criada com
new(incluindo new Number(0)e new Boolean(false))
- Qualquer símbolo
true, 1, "1"E [1]retorno truequando comparados uns com os outros com ==.