$cd~/artigos/type-coercion-como-javascript-converte-tipos
Fundamentals
série 33 Conceitos JS·parte 8 de 38

Type Coercion: Como o JavaScript Converte Tipos Automaticamente (e Por Que `"5" + 3` é `"53"`)

12 minVanderlei José Alamino

Por que "5" + 3 te dá "53", mas "5" - 3 te dá 2? Por que [] == ![] retorna true? Como o JavaScript decide qual tipo um valor deve ter?

snippetJavaScript
// A "útil" conversão de tipos do JavaScript em açãoconsole.log("5" + 3);    // "53" (concatenação de strings!)console.log("5" - 3);    // 2 (subtração numérica)console.log([] == ![]);  // true (espera, o quê?!)

Esse comportamento surpreendente é a coerção de tipo (type coercion). O JavaScript converte valores automaticamente de um tipo para outro. Entender essas regras te ajuda a evitar bugs e escrever código mais previsível.

type-coercion-como-javascript-converte-tipos.meta.jsonjson

// metadados do artigo

{
  "tag": "fundamentos",
  "readTime": "12 min",
  "author": "Vanderlei José Alamino",
  "source": "33jsconcepts.com",
  "series": "33 Conceitos JS",
  "part": {
    "current": 8,
    "total": 38
  }
}
abrir fonte original
type-coercion-como-javascript-converte-tipos.mdmarkdown

Fonte de referência

Conteúdo adaptado a partir do guia original em inglês.

33jsconcepts.com
01

seção

O Que é Coerção de Tipo?

Coerção de tipo é a conversão automática ou implícita de valores de um tipo de dado para outro no JavaScript. Segundo a especificação ECMAScript, o JavaScript realiza essas conversões através de um conjunto de "operações abstratas" — algoritmos internos como ToString, ToNumber e ToBoolean. Quando você usa operadores ou funções que esperam um certo tipo, o JavaScript vai converter (coagir) os valores para fazer a operação funcionar, às vezes de forma útil, às vezes surpreendente. Entender essas regras de conversão te ajuda a escrever código previsível e livre de bugs.

A Analogia do Tradutor Excessivamente Prestativo

Imagine o JavaScript como um tradutor excessivamente prestativo. Quando você lhe dá valores de tipos diferentes, ele tenta "ajudar" convertendo-os — às vezes corretamente, às vezes... criativamente.

Esse comportamento "prestativo" se chama coerção de tipo. O JavaScript converte valores automaticamente de um tipo para outro. Às vezes é útil, às vezes cria bugs que vão assombrar seus sonhos.

snippettext
┌─────────────────────────────────────────────────────────────────────────┐│                    COERÇÃO DE TIPO: O CAMALEÃO                           │├─────────────────────────────────────────────────────────────────────────┤│                                                                          ││        ┌─────────┐                    ┌─────────┐                        ││        │   "5"   │ ──── + 3 ────────► │  "53"   │  String venceu!        ││        │ string  │                    │ string  │                        ││        └─────────┘                    └─────────┘                        ││                                                                          ││        ┌─────────┐                    ┌─────────┐                        ││        │   "5"   │ ──── - 3 ────────► │    2    │  Number venceu!        ││        │ string  │                    │ number  │                        ││        └─────────┘                    └─────────┘                        ││                                                                          ││        Mesmos valores, operadores diferentes, resultados diferentes!       ││                                                                          │└─────────────────────────────────────────────────────────────────────────┘

Coerção Explícita vs Implícita

Existem duas formas de a coerção acontecer:

Coerção Explícita

Você controla a conversão usando funções embutidas. Isso é previsível e intencional.

snippetJavaScript
// VOCÊ decide quando e como converterNumber("42")       // 42String(42)         // "42"Boolean(1)         // true parseInt("42px")   // 42parseFloat("3.14") // 3.14

Essas funções — Number(), String(), Boolean(), parseInt() e parseFloat() — dão controle total. É o caminho seguro. Você sabe exatamente o que está acontecendo.

Coerção Implícita

O JavaScript converte tipos automaticamente quando operadores ou funções esperam um tipo diferente.

snippetJavaScript
// JavaScript "ajuda" sem perguntar"5" + 3           // "53" (número virou string)"5" - 3           // 2 (string virou número) if ("hello") {}   // string virou boolean (true) 5 == "5"          // true (tipos foram coagidos)

É aqui que os bugs se escondem. Aprenda as regras ou sofra as consequências!

Por Que o JavaScript Faz Isso?

JavaScript é uma linguagem dinamicamente tipada. Variáveis não têm tipos fixos. Essa flexibilidade significa que o JavaScript precisa descobrir o que fazer quando os tipos não coincidem.

snippetJavaScript
// Em JavaScript, variáveis podem guardar qualquer tipolet x = 42;       // x é um númerox = "hello";      // agora x é uma stringx = true;         // agora x é um boolean // Então o que acontece aqui?let result = x + 10;  // JavaScript deve decidir como lidar com isso

Outras linguagens lançariam um erro. O JavaScript tenta fazer funcionar. Se isso é uma feature ou um bug... depende de quem você perguntar!

02

seção

Os Três Tipos de Conversão

Aqui está a regra mais importante: o JavaScript só pode converter para TRÊS tipos primitivos:

Tipo-alvoMétodo ExplícitoGatilhos Implícitos Comuns
StringString(valor)+ com string, template literals
NumberNumber(valor)Operadores matemáticos (- * / %), comparações
BooleanBoolean(valor)if, while, !, &&, `, ? :`

É isso. Não importa quão complexa a coerção pareça — o resultado final é sempre string, number ou boolean.

snippettext
┌─────────────────────────────────────────────────────────────────────────┐│                    OS TRÊS DESTINOS DE CONVERSÃO                         │├─────────────────────────────────────────────────────────────────────────┤│                                                                          ││                      ┌──────────────────────┐                            ││                      │    QUALQUER VALOR    │                            ││                      │  (string, number,    │                            ││                      │   object, array...)  │                            ││                      └──────────┬───────────┘                            ││                                 │                                        ││                ┌────────────────┼────────────────┐                       ││                ▼                ▼                ▼                       ││          ┌──────────┐    ┌──────────┐    ┌──────────┐                    ││          │  String  │    │  Number  │    │ Boolean  │                    ││          │   "42"   │    │    42    │    │   true   │                    ││          └──────────┘    └──────────┘    └──────────┘                    ││                                                                          ││          Estes são os ÚNICOS três destinos possíveis!                     ││                                                                          │└─────────────────────────────────────────────────────────────────────────┘
03

seção

Conversão para String

Conversão para string é a mais direta. Quase qualquer coisa pode virar string.

Quando Acontece?

snippetJavaScript
// Conversão explícitaString(123)           // "123"String(true)          // "true"(123).toString()      // "123" // Conversão implícita123 + ""              // "123" (concatenação com string vazia)`Valor: ${123}`       // "Valor: 123" (template literal)"Hello " + 123        // "Hello 123" (+ com string)

O método toString() e template literals também são formas comuns de converter valores para string.

Regras de Conversão para String

ValorResultadoNotas
123"123"Números viram strings de dígitos
-12.34"-12.34"Decimais e negativos funcionam
true"true"Booleans viram suas palavras
false"false"
null"null"
undefined"undefined"
[1, 2, 3]"1,2,3"Arrays unem com vírgulas
[]""Array vazio vira string vazia
{}"[object Object]"Objetos viram isso (geralmente inútil)
Symbol("id")Lança TypeError!Symbols não convertem implicitamente

A Personalidade Dupla do Operador +

O operador + é especial: faz adição E concatenação:

snippetJavaScript
// Com dois números: adição5 + 3               // 8 // Com qualquer string envolvida: concatenação"5" + 3             // "53" (3 vira "3")5 + "3"             // "53" (5 vira "5")"Hello" + " World"  // "Hello World" // A ordem importa com múltiplos operandos!1 + 2 + "3"         // "33" (1+2=3, depois 3+"3"="33")"1" + 2 + 3         // "123" (todos viram strings da esquerda para direita)

Armadilha comum: o operador + com strings pega muitos desenvolvedores de surpresa. Se você está fazendo matemática e obtém concatenação inesperada, verifique se algum valor pode ser string!

snippetJavaScript
// Perigoso: input do usuário é sempre string!const userInput = "5";const result = userInput + 10;  // "510", não 15! // Seguro: converta primeiroconst result = Number(userInput) + 10;  // 15
04

seção

Conversão para Number

Conversão para número tem mais gatilhos que conversão para string — e mais casos extremos para memorizar.

Quando Acontece?

snippetJavaScript
// Conversão explícitaNumber("42")          // 42parseInt("42px")      // 42 (para no não-dígito)parseFloat("3.14")    // 3.14+"42"                 // 42 (truque do + unário) // Conversão implícita"6" - 2               // 4 (subtração)"6" * 2               // 12 (multiplicação)"6" / 2               // 3 (divisão)"6" % 4               // 2 (módulo)"10" > 5              // true (comparação)+"42"                 // 42 (+ unário)

Regras de Conversão para Number

ValorResultadoNotas
"123"123Strings numéricas funcionam
" 123 "123Espaços em branco são removidos
"123abc"NaNQualquer caractere não numérico → NaN
""0String vazia vira 0
" "0Só espaços vira 0
true1
false0
null0null → 0
undefinedNaNundefined → NaN (diferente!)
[]0Array vazio → "" → 0
[1]1Array com elemento único
[1, 2]NaNMúltiplos elementos → NaN
{}NaNObjetos → NaN

null vs undefined: note que Number(null) é 0, mas Number(undefined) é NaN. Essa inconsistência pega muitos desenvolvedores!

snippetJavaScript
Number(null)       // 0Number(undefined)  // NaN null + 5           // 5undefined + 5      // NaN

Operadores Matemáticos Sempre Convertem para Number

Diferente do +, os outros operadores matemáticos (-, *, /, %) só fazem matemática. Eles sempre convertem para números:

snippetJavaScript
"6" - "2"    // 4 (ambos viram números)"6" * "2"    // 12"6" / "2"    // 3"10" % "3"   // 1 // É por isso que - e + se comportam diferente!"5" + 3      // "53" (concatenação)"5" - 3      // 2 (matemática)

O Truque do + Unário

O + unário (sinal de mais antes de um valor) é uma forma rápida de converter para número:

snippetJavaScript
+"42"        // 42+true        // 1+false       // 0+null        // 0+undefined   // NaN+"hello"     // NaN+""          // 0
05

seção

Conversão para Boolean

Conversão booleana é na verdade a mais simples. Todo valor é truthy ou falsy.

Quando Acontece?

snippetJavaScript
// Conversão explícitaBoolean(1)            // trueBoolean(0)            // false!!value               // truque da dupla negação // Conversão implícitaif (value) { }        // verificação de condiçãowhile (value) { }     // condição de loopvalue ? "yes" : "no"  // operador ternáriovalue && doSomething() // AND lógicovalue || defaultValue  // OR lógico!value                // NOT lógico

Os 8 Valores Falsy (Memorize!)

Conforme documentado na referência da MDN sobre valores falsy, existem 8 valores comuns que convertem para false. Todo o resto é true.

snippetJavaScript
// OS OITO FALSYBoolean(false)        // false (óbvio)Boolean(0)            // falseBoolean(-0)           // false (sim, -0 existe)Boolean(0n)           // false (zero BigInt)Boolean("")           // false (string vazia)Boolean(null)         // falseBoolean(undefined)    // falseBoolean(NaN)          // false

Nota técnica: existe na verdade um 9º valor falsy — document.all. É uma API legada de navegador que retorna false em contexto booleano apesar de ser um objeto. Você raramente encontrará isso em código moderno, mas existe por compatibilidade com sites antigos.

Todo o Resto É Truthy!

Isso inclui algumas surpresas:

snippetJavaScript
// Todos estes são TRUE!Boolean(true)         // true (óbvio)Boolean(1)            // trueBoolean(-1)           // true (números negativos!)Boolean("hello")      // trueBoolean("0")          // true (string não vazia!)Boolean("false")      // true (string não vazia!)Boolean([])           // true (array vazio!)Boolean({})           // true (objeto vazio!)Boolean(function(){}) // trueBoolean(new Date())   // trueBoolean(Infinity)     // trueBoolean(-Infinity)    // true

Armadilhas comuns:

snippetJavaScript
// Estes pegam TODO MUNDO:Boolean("0")          // true (é uma string não vazia!)Boolean("false")      // true (é uma string não vazia!)Boolean([])           // true (arrays são objetos, objetos são truthy)Boolean({})           // true (mesmo objetos vazios) // Se quiser verificar array vazio, faça assim:if (arr.length) { }   // verifica se o array tem itensif (arr.length === 0) { }  // verifica se o array está vazio

Operadores Lógicos Não Retornam Booleans!

Um equívoco comum: && e || não necessariamente retornam true ou false. Eles retornam um dos valores originais:

snippetJavaScript
// || retorna o PRIMEIRO valor truthy (ou o último valor)"hello" || "world"    // "hello""" || "world"         // "world""" || 0 || null || "yes"  // "yes" // && retorna o PRIMEIRO valor falsy (ou o último valor)"hello" && "world"    // "world""" && "world"         // ""1 && 2 && 3           // 3 // Isso é útil para defaults!const name = userInput || "Anônimo";const display = user && user.name;
06

seção

Conversão de Objeto para Primitivo

Quando o JavaScript precisa converter um objeto para primitivo (incluindo arrays), ele segue um algoritmo específico.

O Algoritmo ToPrimitive

1. Verificar se já é primitivo

Se o valor já é primitivo (string, number, boolean, etc.), retorna como está.

2. Determinar a "dica" (hint)

O JavaScript decide se quer "string" ou "number" com base no contexto:

  • Dica string: String(), template literals, chaves de propriedade
  • Dica number: Number(), operadores matemáticos, comparações
  • Dica default: operador +, == (geralmente tratado como number)

3. Tentar valueOf() ou toString()

  • Para dica number: tenta valueOf() primeiro, depois toString()
  • Para dica string: tenta toString() primeiro, depois valueOf()

4. Retornar primitivo ou lançar erro

Se um primitivo for retornado, usa-o. Caso contrário, lança TypeError.

Como Objetos Embutidos Convertem

snippetJavaScript
// Arrays — toString() retorna elementos unidos[1, 2, 3].toString()   // "1,2,3"[1, 2, 3] + ""         // "1,2,3"[1, 2, 3] - 0          // NaN (não converte "1,2,3" para número) [].toString()          // ""[] + ""                // ""[] - 0                 // 0 (string vazia → 0) [1].toString()         // "1"[1] - 0                // 1 // Objetos simples — toString() retorna "[object Object]"({}).toString()        // "[object Object]"({}) + ""              // "[object Object]" // Dates — caso especial, preferem string para operador +const date = new Date(0);date.toString()        // "Thu Jan 01 1970 ..."date.valueOf()         // 0 (timestamp em ms) date + ""              // "Thu Jan 01 1970 ..." (usa toString)date - 0               // 0 (usa valueOf)

Conversão Customizada com valueOf e toString

Você pode controlar como seus objetos convertem:

snippetJavaScript
const price = {  amount: 99.99,  currency: "USD",    valueOf() {    return this.amount;  },    toString() {    return `${this.currency} ${this.amount}`;  }}; // Conversão numérica usa valueOf()price - 0              // 99.99price * 2              // 199.98+price                 // 99.99 // Conversão string usa toString()String(price)          // "USD 99.99"`Preço: ${price}`      // "Preço: USD 99.99" // + é ambíguo, usa valueOf() se retornar primitivoprice + ""             // "99.99" (valueOf retornou número, depois → string)

ES6 Symbol.toPrimitive

O ES6 introduziu uma forma mais limpa de controlar conversão — Symbol.toPrimitive:

snippetJavaScript
const obj = {  [Symbol.toPrimitive](hint) {    console.log(`Convertendo com hint: ${hint}`);        if (hint === "number") {      return 42;    }    if (hint === "string") {      return "quarenta e dois";    }    // hint === "default"    return "valor padrão";  }}; +obj           // 42 (hint: "number")`${obj}`       // "quarenta e dois" (hint: "string")obj + ""       // "valor padrão" (hint: "default")
07

seção

O Algoritmo == Explicado

O operador de igualdade frouxa == é onde a coerção de tipo fica selvagem. Para um mergulho mais profundo em todos os operadores de igualdade, veja nosso guia sobre Equality Operators. Veja como o == realmente funciona:

Regras Simplificadas do ==

Mesmo tipo?

Compara diretamente (como ===).

snippetJavaScript
5 == 5           // true"hello" == "hello"  // true

null ou undefined?

null == undefined é true. Nenhum dos dois é igual a mais nada.

snippetJavaScript
null == undefined    // truenull == null         // truenull == 0            // false (regra especial!)null == ""           // false

Number vs String?

Converte a string para número.

snippetJavaScript
5 == "5"// vira: 5 == 5// resultado: true

Boolean envolvido?

Converte o boolean para número PRIMEIRO.

snippetJavaScript
true == "1"// passo 1: 1 == "1" (true → 1)// passo 2: 1 == 1 (string → number)// resultado: true true == "true"// passo 1: 1 == "true" (true → 1)// passo 2: 1 == NaN ("true" → NaN)// resultado: false (surpresa!)

Objeto vs Primitivo?

Converte o objeto para primitivo.

snippetJavaScript
[1] == 1// passo 1: "1" == 1 (array → string "1")// passo 2: 1 == 1 (string → number)// resultado: true

Exemplos Passo a Passo

snippetJavaScript
// Exemplo 1: "5" == 5"5" == 5// String vs Number → converte string para número// 5 == 5// Resultado: true // Exemplo 2: true == "1"true == "1"// Boolean envolvido → converte boolean para número primeiro// 1 == "1"// Number vs String → converte string para número// 1 == 1// Resultado: true // Exemplo 3: [] == false[] == false// Boolean envolvido → converte boolean para número primeiro// [] == 0// Objeto vs Number → converte objeto para primitivo// "" == 0 (array vazio → string vazia)// String vs Number → converte string para número// 0 == 0// Resultado: true // Exemplo 4: [] == ![][] == ![]// Primeiro, avalia ![] → false (arrays são truthy)// [] == false// Boolean envolvido → false vira 0// [] == 0// Objeto vs Number → [] vira ""// "" == 0// String vs Number → "" vira 0// 0 == 0// Resultado: true (sim, de verdade!)

Use ===! O operador de tripla igual nunca coage tipos. Se os tipos são diferentes, retorna false imediatamente. Isso é quase sempre o que você quer.

snippetJavaScript
5 === "5"     // false (tipos diferentes)5 == "5"      // true (coagido) null === undefined  // falsenull == undefined   // true
08

seção

Tabela de Coerção por Operador

Referência rápida de quais operadores disparam qual coerção:

OperadorTipo de CoerçãoExemploResultado
+ (com string)String"5" + 3"53"
+ (unário)Number+"5"5
- * / %Number"5" - 32
++ --Numberlet x = "5"; x++6
> < >= <=Number"10" > 5true
== !=Complexa"5" == 5true
=== !==Nenhuma"5" === 5false
&& ``Boolean (interna)`"oi" \\"tchau"`"oi"
!Boolean!"hello"false
if while ? :Booleanif ("hello")true
& `\ ^ ~`Number (int 32-bit)`"5" \0`5
09

seção

Momentos WAT do JavaScript

Vamos explorar as famosas "partes estranhas" que tornam o JavaScript... especial.

1. A Personalidade Dupla do Operador +

snippetJavaScript
"5" + 3         // "53" (concatenação de string)"5" - 3         // 2 (matemática!) // Por quê? + faz adição E concatenação// Se qualquer operando for string, concatena// - só faz subtração, então converte para números

2. Estranheza do Array Vazio

snippetJavaScript
[] + []         // "" // Ambos arrays → "", depois "" + "" = "" [] + {}         // "[object Object]"// [] → "", {} → "[object Object]" {} + []         // 0 (no console do navegador!)// {} é interpretado como bloco vazio, depois +[] = 0// Envolva em parênteses para corrigir: ({}) + [] = "[object Object]"

3. Matemática Booleana

snippetJavaScript
true + true     // 2 (1 + 1)true + false    // 1 (1 + 0)true - true     // 0 (1 - 1) // Booleans convertem para 1 (true) ou 0 (false)

4. O Infame [] == ![]

snippetJavaScript
[] == ![]       // true // Passo a passo:// 1. ![] → false (arrays são truthy, negado = false)// 2. [] == false// 3. [] == 0 (boolean → number)// 4. "" == 0 (array → string)// 5. 0 == 0 (string → number)// 6. true! // Enquanto isso...[] === ![]      // false (tipos diferentes, sem coerção)

5. "foo" + + "bar"

snippetJavaScript
"foo" + + "bar"   // "fooNaN" // Passo a passo:// 1. +"bar" é avaliado primeiro (+ unário)// 2. +"bar" → NaN (não converte "bar" para número)// 3. "foo" + NaN → "fooNaN"

6. NaN Não É Igual a Si Mesmo

snippetJavaScript
NaN === NaN     // falseNaN == NaN      // false // NaN é o único valor em JavaScript não igual a si mesmo!// Isso é por design (spec IEEE 754) // Como verificar NaN:Number.isNaN(NaN)     // true (forma correta)isNaN(NaN)            // trueisNaN("hello")        // true (errado! converte primeiro)Number.isNaN("hello") // false (correto)

Use Number.isNaN() em vez do isNaN() global para verificação confiável de NaN.

7. Quirks do typeof

snippetJavaScript
typeof NaN        // "number" (wat)typeof null       // "object" (bug histórico)typeof []         // "object" (arrays são objetos)typeof function(){} // "function" (caso especial)

8. Somando Arrays

snippetJavaScript
[1, 2] + [3, 4]   // "1,23,4" // Arrays convertem para strings:// [1, 2] → "1,2"// [3, 4] → "3,4"// "1,2" + "3,4" → "1,23,4" // Para combinar arrays de verdade:[...[1, 2], ...[3, 4]]  // [1, 2, 3, 4][1, 2].concat([3, 4])   // [1, 2, 3, 4]
10

seção

Boas Práticas

Como evitar bugs de coerção:

  1. Use === em vez de == — Sem surpresas, sem coerção
  1. Seja explícito — Use Number(), String(), Boolean() ao converter
  1. Valide entrada — Não assuma tipos, especialmente de input do usuário
  1. Use Number.isNaN() — Não isNaN() ou === NaN
  1. Tenha cuidado com + — Lembre que concatena se qualquer operando for string

Quando a Coerção Implícita É Útil

A Pesquisa de Desenvolvedores do Stack Overflow 2023 reporta que bugs relacionados a tipo permanecem entre os desafios de debugging mais comuns para desenvolvedores JavaScript. Apesar dos gotchas, alguns padrões de coerção implícita são na verdade úteis:

snippetJavaScript
// 1. Verificar null OU undefined de uma vezif (value == null) {  // Isso pega AMBOS null e undefined  // Muito mais limpo que: if (value === null || value === undefined)} // 2. Contexto booleano é natural e legívelif (user) {  // Verificação truthy — totalmente ok} if (items.length) {  // Verificar se array tem itens — totalmente ok} // 3. Conversão rápida para stringconst str = value + "";// ouconst str = String(value);// ouconst str = `${value}`; // 4. Conversão rápida para númeroconst num = +value;// ouconst num = Number(value);

Anti-Padrões a Evitar

snippetJavaScript
// RUIM: Confiar em == para comparações type-unsafeif (x == true) { }  // Não faça isso!if (x) { }          // Faça isso em vez disso // RUIM: Usar == com 0 ou ""if (x == 0) { }     // Combina com "", mas não com null (null == 0 é false!)if (x === 0) { }    // Intenção clara // RUIM: Verificação truthy quando precisa de tipo específicofunction process(count) {  if (!count) return;  // Falha para count = 0!  // ...} function process(count) {  if (typeof count !== "number") return;  // Melhor  // ...}
11

seção

Teste Seu Conhecimento

12

seção

Próximos Passos

Agora que você entende como o JavaScript converte tipos, está pronto para o próximo conceito da nossa série:

→ [Equality Operators — == vs === e como o JavaScript realmente compara valores](/artigos/equality-operators-igualdade-javascript)

Fonte de referência: 33jsconcepts.com/concepts/type-coercion ⬀

$ summary --quick

Resumo rápido

  • Três conversões apenas — O JavaScript converte para String, Number ou Boolean — nada mais
  • Implícita vs Explícita — Saiba quando o JS converte automaticamente vs quando você controla
  • Os 8 valores falsy comuns — false, 0, -0, 0n, "", null, undefined, NaN — todo o resto é truthy (mais o raro document.all)
  • + é especial — Ele prefere concatenação de string se QUALQUER operando for string
  • *- / % são consistentes** — Eles SEMPRE convertem para números
  • == coage, === não — Use === por padrão para evitar surpresas
  • null == undefined — Isso é true, mas nenhum dos dois é igual a mais nada com ==
  • Objetos convertem via valueOf() e toString() — Aprenda esses métodos para controlar conversão
  • Na dúvida, seja explícito — Use Number(), String(), Boolean()
  • NaN é único — É o único valor não igual a si mesmo; use Number.isNaN() para verificar

Créditos da série

Este artigo faz parte de uma série de estudos inspirada no projeto 33 Conceitos JS, criado por Leonardo Maldonado. Todo o conteúdo original está disponível em 33jsconcepts.com.