Todo valor tem um humor booleano
Em JavaScript, você pode colocar qualquer valor onde um booleano é esperado — dentro de um if, como condição de um while, ao lado de && ou ||. Quando isso acontece, o valor sofre uma coerção para true ou false. Os valores que viram false nessa conversão são chamados de falsy. Todo o resto é truthy.
Sem função de conversão, sem cast explícito — o JavaScript faz isso automaticamente. As regras são poucas e fixas, então, uma vez que você decorar a lista de valores falsy, todo o resto vira consequência.
A lista completa de valores falsy em JavaScript
Existem exatamente sete valores falsy. Qualquer outra coisa na linguagem é truthy.
É isso. A lista:
false— o próprio booleano.0e-0— os dois zeros.0n— o zero do BigInt.""— string vazia (aspas simples, duplas ou crase — tanto faz).null— o valor "intencionalmente nada".undefined— o valor "não definido".NaN— o resultado de contas inválidas como0 / 0.
Decore esses sete. Depois, sempre que bater dúvida sobre algum valor, pergunte: "ele é um desses sete?" Se não for, é truthy.
As pegadinhas: "0", [] e {}
É aqui que quem está começando se queima. Vários valores parecem vazios, mas são truthy:
Strings só são falsy quando têm zero caracteres. "0" tem um caractere, então é truthy. Já arrays e objetos são sempre truthy — mesmo vazios — porque o JavaScript trata ambos como objetos, e todo objeto é truthy, independente do que tem dentro.
Se você vem do Python, esse é o maior choque mental. Em Python, [] e {} são falsy. Em JavaScript, não.
Como verificar se está "vazio" do jeito certo
Como [] e {} são truthy, você não pode jogar esses valores direto num if para saber se estão vazios. Seja explícito:
O mesmo vale para strings, caso você queira tratar strings com apenas espaços em branco como vazias:
Truthy/falsy é um atalho conveniente, mas não substitui pensar direito no que "vazio" significa pra sua estrutura de dados.
Convertendo para um booleano de verdade
Às vezes você precisa de um true ou false de verdade, não só de algo "meio truthy". Dois idiomas comuns no JavaScript:
Boolean(x) é a forma explícita de fazer a coerção booleana. Já !!x é a versão abreviada — o primeiro ! converte para boolean e inverte, o segundo ! inverte de novo. As duas formas são comuns no dia a dia. !! é mais curto, mas Boolean() deixa a intenção mais clara na leitura.
É muito comum ver o operador !! em return, quando a função precisa devolver um boolean "limpo":
Valores truthy e falsy com && e ||
Uma coisa que costuma pegar muita gente desprevenida: os operadores lógicos && e || não retornam true ou false — eles devolvem um dos operandos. Qual deles? Depende de quem é truthy e quem é falsy:
É por isso que o padrão value || defaultValue é tão comum para definir valores padrão. Só que ele esconde uma pegadinha: trata todos os valores falsy da mesma forma, incluindo 0 e "", que muitas vezes são entradas válidas:
Se você só quer ter um fallback quando o valor for null ou undefined, use o operador de coalescência nula ??. Esse assunto tem um documento próprio.
Referência rápida
Imprime isso, cola no monitor e segue a vida.
Próximo: Iterators e Generators
Agora que você já domina condicionais e loops, o próximo capítulo mostra como o JavaScript faz valores surgirem sob demanda. Iterators e generators são a engrenagem por trás do for...of, do spread e de boa parte das APIs modernas — e é pra lá que vamos.
Perguntas frequentes
Quais são os valores falsy em JavaScript?
São exatamente sete: false, 0, -0, 0n (BigInt zero), '' (string vazia), null, undefined e NaN. Todo o resto é truthy — incluindo '0', 'false', [] e {}. Decore essa listinha curta de falsy e, por eliminação, você já sabe o comportamento de qualquer outro valor.
Array vazio é truthy ou falsy em JavaScript?
Truthy. O bloco dentro de if ([]) { ... } executa normalmente, o que costuma pegar quem vem de Python ou PHP desprevenido. Arrays e objetos são objetos, e todo objeto é truthy, independentemente do conteúdo. Para testar se um array está vazio, use arr.length === 0 de forma explícita.
Como converter um valor em boolean no JavaScript?
Duas formas: Boolean(value) é a versão explícita, e !!value é o atalho (uma dupla negação que faz a coerção e inverte de novo). As duas seguem as mesmas regras de truthy/falsy. Use quando você precisa de um true/false de verdade, e não só um resultado 'meio truthy'.