Fundamentos · unidade 1 de 27

Tipos, coerção e igualdade

Antes de aplicar a regra, normalize a entrada.

5 min de leitura · 7 cards · 16 exercícios

Card 1 de 7: Tipos, coerção e igualdade01 / 07

Leitura

Por que dados vindos de uma API precisam ser interpretados de forma previsível antes de qualquer regra de negócio.

No backend, esse fundamento aparece quando o código transforma entrada em decisão. O detalhe de linguagem deixa de ser acadêmico no momento em que altera um payload, uma regra de negócio ou a forma como uma falha chega à camada seguinte.

A forma mais útil de estudar é ligar a sintaxe a um contrato observável: o que entra, o que pode mudar, qual resultado sai e qual erro deve continuar o fluxo. É esse raciocínio que os exemplos e exercícios desta unidade procuram treinar.

Código

exemplo.js
"5" + 3 // "53"
"5" - 3 // 2

"1" == 1  // true
"1" === 1 // false

O que fica

  • Coerção implícita muda o significado de operadores.
  • Validação e normalização fazem parte do contrato da API.
  • Igualdade estrita reduz decisões invisíveis no código.

Prática guiada.Leia, rode, quebre e explique cada exercício.

Prática guiada / unidade 01

Um problema de cada vez.

Leia o contrato, escreva sua tentativa e confira os casos esperados. A resolução de referência permanece visível ao final de cada exercício.

Fundamentalexercício 01 / 16

classifyValue(value)

01 / Entenda

Enunciado

retorna uma string descrevendo o tipo real do valor: "null", "undefined", "nan", "number", "string", "boolean", "array", "function", "symbol", "bigint" ou "object". Cuidado com o resultado de typeof null e com NaN.

02 / Implemente

Sua tentativa

Comece pela assinatura e resolva sem olhar a resposta.

ponto de partida
function classifyValue(value) {
  // Escreva sua solução aqui.
}

03 / Preveja

Entrada e saída

Use estes exemplos para entender o contrato antes de programar.

Entrada / chamada

classifyValue(null)

Retorno esperado

"null"

Entrada / chamada

classifyValue(undefined)

Retorno esperado

"undefined"

Entrada / chamada

classifyValue(NaN)

Retorno esperado

"nan"

Entrada / chamada

classifyValue(42)

Retorno esperado

"number"

04 / Teste

Prove que funciona

O teste chama sua função e compara o resultado real com o esperado.

Como utilizar este teste

  1. 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
  2. 02Salve sua implementação em exercises.js, na mesma pasta do teste.
  3. 03Abra o terminal nessa pasta e execute o comando abaixo.
  4. 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="classifyValue" exercises.test.js

Comportamentos cobertos

  • casos básicos
Ver código completo do teste
test("classifyValue: casos básicos", () => {
  assert.equal(classifyValue(null), "null");
  assert.equal(classifyValue(undefined), "undefined");
  assert.equal(classifyValue(NaN), "nan");
  assert.equal(classifyValue(42), "number");
  assert.equal(classifyValue("hi"), "string");
  assert.equal(classifyValue(true), "boolean");
  assert.equal(classifyValue([1, 2]), "array");
  assert.equal(
    classifyValue(() => {}),
    "function",
  );
  assert.equal(classifyValue(Symbol("x")), "symbol");
  assert.equal(classifyValue(10n), "bigint");
  assert.equal(classifyValue({}), "object");
});

Ainda travou?

Dicas graduais

Nível 1 — direção, sem código

Para classifyValue: typeof cobre quase tudo, mas tem duas exceções famosas. Quais valores fazem typeof "mentir"?

Nível 2 — pista mais direta

classifyValue: typeof null === "object" e typeof NaN === "number". Trate esses dois casos antes do typeof genérico.

Nível 3 — quase o código, mas ainda não a solução

classifyValue: comece com

if (value === null) return "null";
if (Number.isNaN(value)) return "nan";

e complete o restante com typeof e Array.isArray.

05 / Compare

Resolução

Esta área permanece livre em todos os exercícios. O código atual da unidade aparece abaixo para comparação com os testes e casos esperados.
código disponível
function classifyValue(value) {
  if (value === null) {
    return "null";
  } else if (Number.isNaN(value)) {
    return "nan";
  } else if (Array.isArray(value)) {
    return "array";
  } else {
    return typeof value;
  }
}