Trilhas
/
JavaScript
JavaScript
/
Exercícios
/
Parque de diversões
Parque de diversões

Parque de diversões

Exercício de aprendizagem

Introdução

Ao contrário de muitas outras linguagens, existem duas entidades diferentes em JavaScript que representam a ausência de um valor (significativo). Existe o null e o undefined.

Null

O valor primitivo null é usado como um "valor vazio" intencional para variáveis de qualquer tipo.

let name = null;
// name is intentionally set to "empty" because it is not
// available

Você pode verificar se uma variável é null usando o operador de igualdade estrita ===.

let name = null;

name === null;
// => true

Undefined

Uma variável à qual não foi atribuído um valor é do tipo undefined.1

Isso significa que, enquanto null representa um valor vazio (mas ainda um valor), undefined representa a ausência total de um valor. 🤯

undefined aparece em contextos diferentes.

  • Se uma variável é declarada sem um valor (inicialização), ela é undefined.
  • Se você tenta acessar o valor de uma chave inexistente em um objeto, você recebe undefined.
  • Se uma função não retorna um valor, o resultado é undefined.
  • Se um argumento não é passado para uma função, ele é undefined, a menos que esse argumento tenha um valor padrão.
let name;
console.log(name);
// => undefined

Você pode verificar se uma variável é undefined usando o operador de igualdade estrita ===.

let name;

name === undefined;
// => true

Encadeamento opcional

Se você tentar recuperar um valor aninhado em um objeto, mas a chave pai não existir, o JavaScript lançará um erro. Para evitar isso facilmente, o encadeamento opcional foi adicionado à especificação da linguagem em 2020. Com o operador de encadeamento opcional ?., você pode garantir que o JavaScript só tente acessar a chave aninhada se o pai não for null ou undefined. Caso contrário, undefined é retornado.

const obj = {
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
};

obj.address.zipCode;
// => undefined

obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined

obj.residence?.street;
// => undefined

Coalescência nula

Há situações em que você quer aplicar um valor padrão caso uma variável seja null ou undefined (mas apenas nesse caso). Para resolver isso, o operador de coalescência nula ?? foi introduzido em 2020. Ele retorna o operando do lado direito apenas quando o operando do lado esquerdo é null ou undefined. Caso contrário, o operando do lado esquerdo é retornado.

let amount = null;
amount = amount ?? 1;
// => 1

amount = 0;
amount = amount ?? 1;
// => 0

[1] Undefined, MDN. (2021). https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined (acessado em 4 de junho de 2021).

Instruções

É seu trabalho fornecer e manter partes do sistema de TI de um parque de diversões. Em particular, você é responsável pelo programa que gerencia visitantes e ingressos.

Primeiro, você vai criar um novo visitante no sistema. Depois, você vai criar uma função para revogar um ingresso. Nas tarefas 3 e 4, você vai trabalhar no sistema de rastreamento de ingressos que ajuda a prevenir falsificações. Por fim, você vai ajudar a adaptar o sistema a novos requisitos legais.

1. Crie um novo visitante

Quando os visitantes chegam ao parque de diversões pela primeira vez, precisam se registrar informando o nome e a idade em um terminal e aceitando os termos e condições. É claro que eles também precisam comprar um ingresso. Cada ingresso tem um identificador como H32AZ123.

Escreva uma função createVisitor que aceita três argumentos.

  • O nome do visitante.
  • A idade do visitante.
  • O identificador do ingresso que o visitante comprou.

A função deve retornar um objeto que guarda essas informações. As chaves do objeto devem se chamar name, age e ticketId.

createVisitor('Verena Nardi', 45, 'H32AZ123');
// => { name: 'Verena Nardi', age: 45, ticketId: 'H32AZ123' }

2. Revogue o ingresso

Quando as pessoas saem do parque de diversões, o ingresso delas é revogado. Se elas voltarem, precisam comprar um novo. Para economizar tempo dos visitantes frequentes, eles só precisam se registrar uma vez e as informações do visitante ficam guardadas para as visitas seguintes.

Isso significa que, quando um visitante sai do parque, apenas o ingresso dele deve ser invalidado, mas o restante do objeto do visitante deve continuar igual. Implemente a função revokeTicket que aceita um objeto de visitante, define o identificador do ingresso como null e retorna o objeto em seguida.

const visitor = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

revokeTicket(visitor);
// => { name: 'Verena Nardi', age: 45, ticketId: null }

3. Determine o status do ingresso

Para prevenir falsificações, os identificadores dos ingressos são únicos. Assim que um ingresso é impresso, seu identificador é adicionado como chave em um objeto no sistema, para que possa ser rastreado.

Antes de o ingresso ser vendido a um visitante, ele é armazenado com o valor null no objeto de rastreamento de ingressos. Quando ele é vendido a um visitante, o nome do visitante é atribuído como valor. Quando os funcionários têm dúvidas sobre a validade de um ingresso, eles precisam verificar o status do ingresso no sistema.

Implemente uma função ticketStatus que aceita o objeto de rastreamento e um identificador de ingresso como argumentos. Ela deve retornar um dos seguintes resultados.

  • 'unknown ticket id' se o identificador não foi encontrado no objeto de rastreamento
  • 'not sold' caso o ingresso tenha sido impresso mas não vendido
  • 'sold to {name}', em que {name} é o nome do visitante se o ingresso foi vendido
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'

ticketStatus(tickets, '0H2AZ123');
// => 'not sold'

ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'

4. Melhore a resposta do status do ingresso

Depois de um tempo, você recebe um retorno dos funcionários de que eles querem que o status do ingresso seja mais fácil de entender à primeira vista. Eles querem ver apenas o nome do visitante ou que o ingresso é inválido.

Escreva uma função simpleTicketStatus que aceita os mesmos argumentos que ticketStatus na tarefa 3. Essa função retorna apenas um de dois resultados diferentes.

  • o nome do visitante, se o ingresso foi vendido
  • 'invalid ticket !!!' se o ingresso ainda não foi vendido ou o identificador não foi encontrado no objeto de rastreamento
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'

simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'

simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'

5. Determine a versão dos termos e condições

Devido a novos requisitos legais, os objetos de visitante recém-criados agora também contêm informações detalhadas sobre os "General Terms & Conditions" (GTC) que o usuário aceitou. Você pode ver um exemplo do novo objeto de visitante abaixo.

Os operadores de caixa do parque de diversões agora precisam verificar se um visitante precisa assinar uma nova versão dos GTC. Para isso, implemente uma função gtcVersion que aceita um objeto de visitante como argumento e retorna a versão dos GTC se ela estiver disponível. Se a informação da versão não estiver disponível, nada deve ser retornado.

const visitorNew = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
  gtc: {
    signed: true,
    version: '2.1',
  },
};

gtcVersion(visitorNew);
// => '2.1'

const visitorOld = {
  name: 'Verena Nardi',
  age: 45,
  ticketId: 'H32AZ123',
};

gtcVersion(visitorOld);
// => undefined
Editar via GitHub O link abre em uma nova janela ou aba
JavaScript Exercism

Tudo pronto para começar Parque de diversões?

Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.