Quais são os valores em JavaScript que são 'Falsey' , o que significa que eles avaliam como falsa em expressões como if(value)
, value ?
e !value
?
Já existem algumas discussões sobre o objetivo dos valores de falsey no Stack Overflow , mas nenhuma resposta completa e exaustiva lista quais são todos os valores de falsey.
Não consegui encontrar nenhuma lista completa no MDN JavaScript Reference e fiquei surpreso ao descobrir que os principais resultados ao procurar uma lista completa e autorizada de valores falsey no JavaScript eram artigos de blog, alguns dos quais tinham omissões óbvias (por exemplo, NaN
), e nenhum deles tinha um formato como o Stack Overflow, onde comentários ou respostas alternativas podiam ser adicionados para apontar peculiaridades, surpresas, omissões, erros ou advertências. Então, parecia fazer sentido fazer um.
fonte
if()
guia para veracidade.[[]] == ""
A[] != []
minha cabeça dói ...Respostas:
Valores de Falsey em JavaScript
false
Number
tipo:0
e também-0
,0.0
e forma hexagonal0x0
( graças RBT )BigInt
tipo:0n
e-0n
(novo em 2020, obrigado GetMeARemoteJob )""
,''
e``
- cadeias de comprimento 0null
undefined
NaN
document.all
(apenas em navegadores HTML)document.all
é um objeto falsey, comtypeof
asundefined
. Era uma função de propriedade da Microsoft no IE anterior ao IE11 e foi adicionada à especificação HTML como uma "violação intencional da especificação JavaScript" para que os sites escritos para o IE não interrompessem a tentativa de acessar, por exemplodocument.all.something
; é falso, porqueif (document.all)
costumava ser uma maneira popular de detectar o IE, antes dos comentários condicionais. Consulte Por que o document.all é falso? para detalhes"Falsey" significa simplesmente que a
ToBoolean
função interna do JavaScript retornafalse
.ToBoolean
subjaz!value
,value ? ... : ...;
eif (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 eBigInt
mencionados acima:Comparações com
==
(igualdade solta)Vale a pena falar das comparações frouxas
==
dos valores falsos , que usamToNumber()
e podem causar alguma confusão devido às diferenças subjacentes. Eles formam efetivamente três grupos:false, 0, -0, "", ''
todos combinam com==
false == ""
,'' == 0
e portanto4/2 - 2 == 'some string'.slice(11);
null, undefined
combina com==
null == undefined
masundefined != false
typeof null
retornos'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.all
quando o Javascript é implementado em HTML)NaN
não corresponde a nada, com==
ou===
, nem mesmo a si próprioNaN != 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
ToBoolean
função interna do JavaScript retornatrue
. Um capricho do Javascript estar ciente de (e outra boa razão para preferir===
mais==
): é possível para um valor a ser truthy (ToBoolean
retornostrue
), 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 exemplo42 == "42"
). Desde0 == false
, se"0" == 0
,"0" == false
.new Number(0)
enew 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 a0
[]
,[[]]
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 brancoQualquer coisa de
typeof
, que sempre retorna uma string não vazia, por exemplo:typeof null
(retorna uma string'object'
devido a um bug / peculiaridade de longa data )typeof undefined
(retorna uma string'undefined'
)Qualquer objeto (exceto a "violação intencional"
document.all
nos navegadores; lembre-se de quenull
não é realmente um objeto, apesar detypeof
sugerir o contrário). Incluindo:{}
[]
function(){}
ou() => {}
(qualquer função, incluindo funções vazias)Error
e qualquer instância deError
new
(incluindonew Number(0)
enew Boolean(false)
)true
,1
,"1"
E[1]
retornotrue
quando comparados uns com os outros com==
.fonte
!
,if
e?..:
têm em comum é que eles chamam o internoToBoolean
função do valor. Como esses valores se comportam no contexto de!
,if
etc. já está implícito em seu nome: eles são valores "falsos". Eu sou um pouco de medo que os outros vão ler a resposta e pensar "Oh so neste contexto (!
,if
,?...:
), o valor éfalse
, mas com!!
, étrue
" , mas não entendo o conceito subjacente. Dois outros pontos: 1)v ? true : false
é apenas uma maneira detalhada de!!v
. 2)typeof
sempre retorna uma string não vazia, que é verdadeira.typeof null
Ou seja, não há nenhum ponto em olhar outypeof undefined
especificamente. Você poderia apenas dizer que strings não vazias são verdadeiras.document.all
é falso .x == false
chamará oToNumber(x)
que é muito diferente deToBoolean(x)
. Vale a pena explicar. Também acabei de notar que já comentei essa resposta há séculos: DNão se esqueça da string não vazia
"false"
que é avaliada comotrue
fonte
:-)
Apenas para adicionar à lista de valores falsos do @ user568458:
Além do número inteiro 0, o número decimal 0.0, 0.00 ou qualquer número zero também é um valor falso.
Impressões de trechos de código acima
I am a falsy value
Da mesma forma, a representação hexadecimal do número 0 também é um valor falso, conforme mostrado no trecho de código abaixo:
O trecho de código acima é impresso novamente
I am a falsy value
.fonte
0
,0x0
,0.0
E0.00
são apenas diferentes literais para o mesmo IEEE-754 64-bit ponto flutuante valor zero.Além do tópico, a partir do ES2020, temos um novo valor que é falso, é BigInt zero (0n):
Portanto, com isso, agora temos 7 valores "falsy" no total (sem incluir document.all, como mencionado pelo usuário acima, pois faz parte do DOM e não JS).
fonte