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.
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
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.
undefined.undefined.undefined.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
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
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).
É 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.
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.
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' }
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 }
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 vendidoconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
ticketStatus(tickets, 'RE90VAW7');
// => 'unknown ticket id'
ticketStatus(tickets, '0H2AZ123');
// => 'not sold'
ticketStatus(tickets, '23LA9T41');
// => 'sold to Verena Nardi'
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.
'invalid ticket !!!' se o ingresso ainda não foi vendido ou o identificador não foi encontrado no objeto de rastreamentoconst tickets = {
'0H2AZ123': null,
'23LA9T41': 'Verena Nardi',
};
simpleTicketStatus(tickets, '23LA9T41');
// => 'Verena Nardi'
simpleTicketStatus(tickets, '0H2AZ123');
// => 'invalid ticket !!!'
simpleTicketStatus(tickets, 'RE90VAW7');
// => 'invalid ticket !!!'
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
Crie sua conta no Exercism para aprender e dominar JavaScript com 37 conceitos159 exercícios e mentoria humana de verdade, tudo de graça.