Funções e dados · unidade 7 de 27
Referências, mutabilidade e cópias
Referência compartilhada também é estado compartilhado.
01 / 07Use as setas do teclado ou deslize
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
const copy = { ...user }
// copy.profile ainda é compartilhadoO 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.
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.
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
trueEntrada / chamada
isPrimitiveValue("texto")Retorno esperado
trueEntrada / chamada
isPrimitiveValue(true)Retorno esperado
trueEntrada / chamada
isPrimitiveValue(null)Retorno esperado
true04 / Teste
Prove que funciona
O teste chama sua função e compara o resultado real com o esperado.
Como utilizar este teste
- 01Implemente a função usando exatamente o nome e os parâmetros do enunciado.
- 02Salve sua implementação em
exercises.js, na mesma pasta do teste. - 03Abra o terminal nessa pasta e execute o comando abaixo.
- 04Se falhar, compare “esperado” com “recebido”; essa diferença mostra o caso que precisa ser corrigido.
node --test --test-name-pattern="isPrimitiveValue" exercises.test.jsComportamentos 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
function isPrimitiveValue(value) {
const tiposValidos = ["string", "number", "boolean", "undefined"];
if (tiposValidos.includes(typeof value)) {
return true;
}
if (value === null) {
return true;
}
return false;
}