Funções e dados · unidade 7 de 27

Referências, mutabilidade e cópias

Referência compartilhada também é estado compartilhado.

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

Card 1 de 7: Referências, mutabilidade e cópias01 / 07

Leitura

Cópia rasa, cópia profunda e os bugs silenciosos que aparecem quando duas partes do sistema apontam para o mesmo dado.

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
const copy = { ...user }
// copy.profile ainda é compartilhado

O que fica

  • Spread cria apenas uma cópia rasa.
  • Objetos iguais em conteúdo não são a mesma referência.
  • Métodos mutáveis como sort pedem intenção explícita.

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

Prática guiada / unidade 07

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

isPrimitiveValue(value)

01 / Entenda

Enunciado

retorna true se value for um tipo primitivo (string, number, boolean, null, undefined), e false se for objeto, array ou função.

02 / Implemente

Sua tentativa

Comece pela assinatura e resolva sem olhar a resposta.

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

03 / Preveja

Entrada e saída

Use estes exemplos para entender o contrato antes de programar.

Entrada / chamada

isPrimitiveValue(42)

Retorno esperado

true

Entrada / chamada

isPrimitiveValue("texto")

Retorno esperado

true

Entrada / chamada

isPrimitiveValue(true)

Retorno esperado

true

Entrada / chamada

isPrimitiveValue(null)

Retorno esperado

true

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="isPrimitiveValue" exercises.test.js

Comportamentos cobertos

  • identifica tipos primitivos
  • rejeita objetos, arrays e funções
Ver código completo do teste
test("isPrimitiveValue: identifica tipos primitivos", () => {
  assert.equal(isPrimitiveValue(42), true);
  assert.equal(isPrimitiveValue("texto"), true);
  assert.equal(isPrimitiveValue(true), true);
  assert.equal(isPrimitiveValue(null), true);
  assert.equal(isPrimitiveValue(undefined), true);
});

test("isPrimitiveValue: rejeita objetos, arrays e funções", () => {
  assert.equal(isPrimitiveValue({}), false);
  assert.equal(isPrimitiveValue([]), false);
  assert.equal(
    isPrimitiveValue(() => {}),
    false,
  );
});

Ainda travou?

Dicas graduais

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

Para isPrimitiveValue: quais são os tipos primitivos de JavaScript? typeof retorna algo diferente para cada um deles, exceto para um caso especial (null). Qual é esse caso?

Nível 2 — pista mais direta

isPrimitiveValue: typeof value !== "object" && typeof value !== "function" cobre quase tudo, mas typeof null === "object" — trate null à parte (ele também é primitivo).

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 isPrimitiveValue(value) {
  const tiposValidos = ["string", "number", "boolean", "undefined"];
  if (tiposValidos.includes(typeof value)) {
    return true;
  }
  if (value === null) {
    return true;
  }
  return false;
}