[DICA] Javascript - Coerção de Tipos para boolean (falsy/truthy)

Olá pessoal, venho com esse tópico, trazer um assunto que causa um pouco de dúvida para iniciantes no Javascript, chamado Coerção de Tipos (type coercion), principalmente de atributos/objetos para valores booleanos.

Coerção de Tipos nada mais é que a conversão de um valor de um tipo para outro tipo, seja ele um tipo primitivo (number, string, boolean, etc…) ou um objeto. Essa coerção pode ser explícita ou implícita.

Coerção Explícita

É quando utilizamos métodos para converter um tipo, também chamado de type casting, exemplos:

Boolean(1)       //true
Boolean(null)    //false

Coerção Implícita

O Javascript por ser uma linguagem fracamente tipada, a depender da situação, os valores podem ser convertidos automaticamente, a isso é dado o nome de coerção implícita.
Isso acontece quando atribuímos para valores de diferentes tipos, ou onde usamos operadores (||, &&, !) em um contexto, ou onde é necessário retornar um valor booleano.

Obs.: Os operadores lógicos como II ou && fazem conversões internamente, porém retornam os valores dos operandos originais, exemplo:

let teste = true && 10
console.log(teste)      // 10

Alguns Exemplos de valores aceitos como false (falsy)

  • 0 (Valor numérico zero);
  • 0n (Bigint com valor numérico zero);
  • null (Tipo primitivo nulo);
  • undefined (Sem valor atribuído, indefinido);
  • NaN (Not-a-number);
  • “” ou ‘’ (Cadeia de caracteres vazia);
console.log(0 ? true : false)           //false
console.log(0n ? true : false)          //false
console.log(null ? true : false)        //false
console.log(Number.NaN ? true : false)  //false
console.log('' ? true : false)          //false

Alguns Exemplos de valores aceitos como true (truthy)

  • ‘0’ ou “0” (Cadeia de caracteres com um zero);
  • ‘false’ ou “false” (Cadeia de caracteres com a palavra false);
  • [] (Um Vetor Vazio);
  • {} (Um objeto sem propriedades);
  • ()=>{} (Uma definição de função, seja anônima ou não);
console.log('0' ? true : false)     // true
console.log('false' ? true : false) // true
console.log([] ? true : false)      // true
console.log({} ? true : false)      //true

Operador Restrito de Igualdade ===

O único operador que não desencadeia a coerção implícita é o ===, em contrapartida, o operador de igualdade == faz a comparação e ativa a coerção de tipos.

Um bom site para verificar o resultado dessas diversas operações é o JavaScript-Equality-Table

Usando Coerção Implícita para economizar código

A coerção implícita é muito útil, desde que você saiba o que está fazendo, caso contrário pode ser um problema.

“Sempre use ===, a menos que você tenha um bom motivo para usar ==”

Um bom motivo para tal, é economizar código. Vamos a um simples exemplo de código onde precisamos atribuir uma variável a outra caso a primeira não seja null, undefined ou vazia, caso seja, vamos atribuir um valor padrão.

Sem Coerção Implícita

let x
let y
if (x !== null && x !== undefined && x !== '')
   y = x
else {
   y= 'Valor Padrão'
}
console.log(y) //Valor Padrão
let x = 'Teste'
let y
if (x !== null && x !== undefined && x !== '')
   y = x
else {
   y= 'Valor Padrão'
}
console.log(y) //Teste

Usando Coerção Implícita

let x
let y = x || 'Valor Padrão'
console.log(y) //Valor Padrão
let x = ''
let y = x || 'Valor Padrão'
console.log(y) //Valor Padrão
let x = 'Teste'
let y = x || 'Valor Padrão'
console.log(y) //Teste

Bem pessoal, é isso, espero que isso ajude nos estudos de vocês, principalmente quem está começando.

9 Likes