Track
/
JavaScript
JavaScript
/
Esercizi
/
Parco divertimenti
Parco divertimenti

Parco divertimenti

Esercizio di apprendimento

Introduzione

A differenza di molti altri linguaggi, in JavaScript ci sono due entità diverse che rappresentano l'assenza di un valore (significativo): null e undefined.

Null

Il valore primitivo null viene usato come «valore vuoto» intenzionale per variabili di qualsiasi tipo.

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

Puoi verificare se una variabile è null usando l'operatore di uguaglianza stretta ===.

let name = null;

name === null;
// => true

Undefined

Una variabile a cui non è stato assegnato un valore è di tipo undefined.1

Questo significa che mentre null rappresenta un valore vuoto (ma pur sempre un valore), undefined rappresenta l'assenza totale di un valore. 🤯

undefined compare in contesti diversi.

  • Se una variabile viene dichiarata senza un valore (inizializzazione), è undefined.
  • Se provi ad accedere al valore di una chiave inesistente in un oggetto, ottieni undefined.
  • Se una funzione non restituisce un valore, il risultato è undefined.
  • Se a una funzione non viene passato un argomento, questo è undefined, a meno che quell'argomento non abbia un valore predefinito.
let name;
console.log(name);
// => undefined

Puoi verificare se una variabile è undefined usando l'operatore di uguaglianza stretta ===.

let name;

name === undefined;
// => true

Concatenamento opzionale

Se provi a recuperare un valore annidato in un oggetto ma la chiave genitore non esiste, JavaScript genera un errore. Per evitarlo facilmente, il concatenamento opzionale è stato aggiunto alla specifica del linguaggio nel 2020. Con l'operatore di concatenamento opzionale ?. puoi assicurarti che JavaScript provi ad accedere alla chiave annidata solo se il genitore non è null o undefined. Altrimenti, viene restituito undefined.

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

Coalescenza nullish

Ci sono situazioni in cui vuoi applicare un valore predefinito nel caso in cui una variabile sia null o undefined (ma solo in quel caso). Per risolvere questo problema, l'operatore di coalescenza nullish ?? è stato introdotto nel 2020. Restituisce l'operando di destra solo quando l'operando di sinistra è null o undefined. Altrimenti, viene restituito l'operando di sinistra.

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 (consultato il 4 giugno 2021).

Istruzioni

Il tuo compito è fornire e mantenere parti del sistema informatico di un parco divertimenti. In particolare, sei responsabile del programma che gestisce i visitatori e i biglietti.

Per prima cosa, creerai un nuovo visitatore nel sistema. Poi fornirai una funzione per revocare un biglietto. Nei compiti 3 e 4 lavorerai sul sistema di tracciamento dei biglietti che aiuta a prevenire le contraffazioni. Infine, aiuterai ad adattare il sistema ai nuovi requisiti legali.

1. Crea un nuovo visitatore

Quando i visitatori arrivano al parco divertimenti per la prima volta, devono registrarsi inserendo il proprio nome e la propria età in un terminale e accettando i termini e le condizioni. Naturalmente, devono anche comprare un biglietto. Ogni biglietto ha un identificatore come H32AZ123.

Scrivi una funzione createVisitor che accetta tre argomenti.

  • Il nome del visitatore.
  • L'età del visitatore.
  • L'identificatore del biglietto che il visitatore ha comprato.

La funzione deve restituire un oggetto che contiene queste informazioni. Le chiavi dell'oggetto devono chiamarsi name, age e ticketId.

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

2. Revoca il biglietto

Quando le persone lasciano il parco divertimenti, il loro biglietto viene revocato. Se tornano, devono comprarne uno nuovo. Per far risparmiare un po' di tempo ai visitatori abituali, devono registrarsi una sola volta e le informazioni sul visitatore vengono conservate per le visite successive.

Ciò significa che quando un visitatore lascia il parco, va invalidato solo il suo biglietto, mentre il resto dell'oggetto visitatore deve rimanere uguale. Implementa la funzione revokeTicket che accetta un oggetto visitatore, imposta l'identificatore del biglietto su null e infine restituisce l'oggetto.

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

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

3. Determina lo stato del biglietto

Per prevenire le contraffazioni, gli identificatori dei biglietti sono univoci. Una volta stampato un biglietto, il suo identificatore viene aggiunto come chiave in un oggetto nel sistema, in modo da poterlo tracciare.

Prima che il biglietto venga venduto a un visitatore, viene memorizzato con il valore null nell'oggetto di tracciamento dei biglietti. Quando viene venduto a un visitatore, come valore viene assegnato il nome del visitatore. Quando i dipendenti hanno dubbi sulla validità di un biglietto, devono controllarne lo stato nel sistema.

Implementa una funzione ticketStatus che accetta l'oggetto di tracciamento e un identificatore di biglietto come argomenti. Deve restituire uno dei seguenti risultati.

  • 'unknown ticket id' se l'identificatore non è stato trovato nell'oggetto di tracciamento
  • 'not sold' se il biglietto è stato stampato ma non venduto
  • 'sold to {name}' dove {name} è il nome del visitatore se il biglietto è stato venduto
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. Migliora la risposta dello stato del biglietto

Dopo un po', ricevi un riscontro dai dipendenti: vogliono che lo stato del biglietto sia più facile da capire a colpo d'occhio. Vogliono vedere soltanto il nome del visitatore oppure che il biglietto non è valido.

Scrivi una funzione simpleTicketStatus che accetta gli stessi argomenti di ticketStatus nel compito 3. Questa funzione restituisce solo uno tra due risultati diversi.

  • il nome del visitatore se il biglietto è stato venduto
  • 'invalid ticket !!!' se il biglietto non è ancora stato venduto o l'identificatore non è stato trovato nell'oggetto di tracciamento
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

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

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

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

5. Determina la versione dei termini e condizioni

A causa dei nuovi requisiti legali, gli oggetti visitatore appena creati ora contengono anche informazioni dettagliate sulle «Condizioni generali di contratto» (GTC) che l'utente ha accettato. Qui sotto puoi vedere un esempio del nuovo oggetto visitatore.

Ora i cassieri del parco divertimenti devono controllare se un visitatore deve firmare una nuova versione delle GTC. Per questo, implementa una funzione gtcVersion che accetta un oggetto visitatore come argomento e restituisce la versione delle GTC, se disponibile. Se le informazioni sulla versione non sono disponibili, non va restituito nulla.

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
Modifica tramite GitHub Il link si apre in una nuova finestra o scheda
JavaScript Exercism

Vuoi iniziare Parco divertimenti?

Iscriviti a Exercism per imparare e padroneggiare JavaScript con 37 concetti159 esercizi e il mentoring di persone reali, tutto gratis.