Λούνα Παρκ

Λούνα Παρκ

Άσκηση εκμάθησης

Εισαγωγή

Σε αντίθεση με πολλές άλλες γλώσσες, στη JavaScript υπάρχουν δύο διαφορετικές οντότητες που αντιπροσωπεύουν την απουσία μιας (ουσιαστικής) τιμής. Υπάρχουν το null και το undefined.

Null

Η πρωτόγονη τιμή null χρησιμοποιείται ως σκόπιμη "κενή τιμή" για μεταβλητές οποιουδήποτε τύπου.

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

Μπορείς να ελέγξεις αν μια μεταβλητή είναι null χρησιμοποιώντας τον τελεστή αυστηρής ισότητας ===.

let name = null;

name === null;
// => true

Undefined

Μια μεταβλητή στην οποία δεν έχει ανατεθεί τιμή είναι τύπου undefined.1

Αυτό σημαίνει ότι ενώ το null αντιπροσωπεύει μια κενή τιμή (αλλά παρ' όλα αυτά μια τιμή), το undefined αντιπροσωπεύει την πλήρη απουσία τιμής. 🤯

Το undefined εμφανίζεται σε διαφορετικά πλαίσια.

  • Αν μια μεταβλητή δηλωθεί χωρίς τιμή (αρχικοποίηση), είναι undefined.
  • Αν προσπαθήσεις να προσπελάσεις μια τιμή για ένα κλειδί που δεν υπάρχει σε ένα αντικείμενο, παίρνεις undefined.
  • Αν μια συνάρτηση δεν επιστρέφει τιμή, το αποτέλεσμα είναι undefined.
  • Αν ένα όρισμα δεν περαστεί σε μια συνάρτηση, είναι undefined, εκτός αν αυτό το όρισμα έχει προεπιλεγμένη τιμή.
let name;
console.log(name);
// => undefined

Μπορείς να ελέγξεις αν μια μεταβλητή είναι undefined χρησιμοποιώντας τον τελεστή αυστηρής ισότητας ===.

let name;

name === undefined;
// => true

Προαιρετική αλυσίδωση

Αν προσπαθήσεις να ανακτήσεις μια εμφωλευμένη τιμή σε ένα αντικείμενο αλλά το γονικό κλειδί δεν υπάρχει, η JavaScript θα πετάξει ένα σφάλμα. Για να αποφευχθεί εύκολα αυτό, η προαιρετική αλυσίδωση προστέθηκε στην προδιαγραφή της γλώσσας το 2020. Με τον τελεστή προαιρετικής αλυσίδωσης ?. μπορείς να διασφαλίσεις ότι η JavaScript προσπαθεί να προσπελάσει το εμφωλευμένο κλειδί μόνο αν ο γονέας δεν ήταν null ή undefined. Διαφορετικά, επιστρέφεται το 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

Μηδενική συνένωση

Υπάρχουν περιπτώσεις όπου θέλεις να εφαρμόσεις μια προεπιλεγμένη τιμή σε περίπτωση που μια μεταβλητή είναι null ή undefined (αλλά μόνο τότε). Για να καλυφθεί αυτό, ο τελεστής μηδενικής συνένωσης ?? εισήχθη το 2020. Επιστρέφει τον δεξιό τελεστέο μόνο όταν ο αριστερός τελεστέος είναι null ή undefined. Διαφορετικά, επιστρέφεται ο αριστερός τελεστέος.

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 (πρόσβαση στις 4 Ιουνίου 2021).

Οδηγίες

Η δουλειά σου είναι να παρέχεις και να συντηρείς μέρη του πληροφοριακού συστήματος ενός λούνα παρκ. Συγκεκριμένα, είσαι υπεύθυνος για το πρόγραμμα που διαχειρίζεται επισκέπτες και εισιτήρια.

Πρώτα, θα δημιουργήσεις έναν νέο επισκέπτη στο σύστημα. Έπειτα, θα φτιάξεις μια συνάρτηση για την ακύρωση ενός εισιτηρίου. Στις εργασίες 3 και 4, θα δουλέψεις πάνω στο σύστημα παρακολούθησης εισιτηρίων που βοηθά στην αποτροπή της πλαστογράφησης. Τέλος, θα βοηθήσεις να προσαρμοστεί το σύστημα στις νέες νομικές απαιτήσεις.

1. Δημιούργησε έναν νέο επισκέπτη

Όταν οι επισκέπτες έρχονται στο λούνα παρκ για πρώτη φορά, πρέπει να εγγραφούν δίνοντας το όνομα και την ηλικία τους σε ένα τερματικό και αποδεχόμενοι τους όρους και τις προϋποθέσεις. Φυσικά, πρέπει επίσης να αγοράσουν ένα εισιτήριο. Κάθε εισιτήριο έχει ένα αναγνωριστικό όπως το H32AZ123.

Γράψε μια συνάρτηση createVisitor που δέχεται τρία ορίσματα.

  • Το όνομα του επισκέπτη.
  • Την ηλικία του επισκέπτη.
  • Το αναγνωριστικό του εισιτηρίου που αγόρασε ο επισκέπτης.

Η συνάρτηση πρέπει να επιστρέφει ένα αντικείμενο που περιέχει αυτές τις πληροφορίες. Τα κλειδιά του αντικειμένου πρέπει να ονομάζονται name, age και ticketId.

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

2. Ακύρωσε το εισιτήριο

Όταν οι άνθρωποι φεύγουν από το λούνα παρκ, το εισιτήριό τους ακυρώνεται. Αν επιστρέψουν, πρέπει να αγοράσουν ένα καινούργιο. Για να εξοικονομήσουν λίγο χρόνο οι τακτικοί επισκέπτες, χρειάζεται να εγγραφούν μόνο μία φορά και τα στοιχεία του επισκέπτη διατηρούνται για τις επόμενες επισκέψεις.

Αυτό σημαίνει ότι όταν ένας επισκέπτης φεύγει από το πάρκο, μόνο το εισιτήριό του πρέπει να ακυρώνεται, ενώ το υπόλοιπο αντικείμενο του επισκέπτη πρέπει να παραμένει ίδιο. Υλοποίησε τη συνάρτηση revokeTicket που δέχεται ένα αντικείμενο επισκέπτη, θέτει το αναγνωριστικό του εισιτηρίου σε null και επιστρέφει το αντικείμενο μετά.

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

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

3. Προσδιόρισε την κατάσταση του εισιτηρίου

Για να αποτρέπεται η πλαστογράφηση, τα αναγνωριστικά των εισιτηρίων είναι μοναδικά. Μόλις εκτυπωθεί ένα εισιτήριο, το αναγνωριστικό του προστίθεται ως κλειδί σε ένα αντικείμενο του συστήματος, ώστε να μπορεί να παρακολουθείται.

Πριν πουληθεί το εισιτήριο σε έναν επισκέπτη, αποθηκεύεται με την τιμή null στο αντικείμενο παρακολούθησης εισιτηρίων. Όταν πουληθεί σε έναν επισκέπτη, το όνομα του επισκέπτη ορίζεται ως τιμή. Όταν οι υπάλληλοι έχουν αμφιβολίες για την εγκυρότητα ενός εισιτηρίου, πρέπει να ελέγξουν την κατάστασή του στο σύστημα.

Υλοποίησε μια συνάρτηση ticketStatus που δέχεται το αντικείμενο παρακολούθησης και ένα αναγνωριστικό εισιτηρίου ως ορίσματα. Πρέπει να επιστρέφει ένα από τα παρακάτω αποτελέσματα.

  • 'unknown ticket id' αν το αναγνωριστικό δεν βρέθηκε στο αντικείμενο παρακολούθησης
  • 'not sold' σε περίπτωση που το εισιτήριο εκτυπώθηκε αλλά δεν πουλήθηκε
  • 'sold to {name}' όπου {name} είναι το όνομα του επισκέπτη αν το εισιτήριο πουλήθηκε
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. Βελτίωσε την απόκριση της κατάστασης του εισιτηρίου

Μετά από λίγο καιρό, παίρνεις σχόλια από τους υπαλλήλους ότι θέλουν η κατάσταση του εισιτηρίου να είναι πιο εύκολη στην πρώτη ματιά. Θέλουν να βλέπουν μόνο είτε το όνομα του επισκέπτη είτε ότι το εισιτήριο είναι άκυρο.

Γράψε μια συνάρτηση simpleTicketStatus που δέχεται τα ίδια ορίσματα με τη ticketStatus στην εργασία 3. Αυτή η συνάρτηση επιστρέφει μόνο ένα από δύο διαφορετικά αποτελέσματα.

  • το όνομα του επισκέπτη αν το εισιτήριο πουλήθηκε
  • 'invalid ticket !!!' αν το εισιτήριο δεν έχει πουληθεί ακόμη ή το αναγνωριστικό δεν βρέθηκε στο αντικείμενο παρακολούθησης
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

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

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

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

5. Προσδιόρισε την έκδοση των όρων και προϋποθέσεων

Λόγω νέων νομικών απαιτήσεων, τα νεοδημιουργημένα αντικείμενα επισκέπτη περιέχουν πλέον και λεπτομερείς πληροφορίες για τους "Γενικούς Όρους και Προϋποθέσεις" (GTC) που αποδέχτηκε ο χρήστης. Μπορείς να δεις ένα παράδειγμα του νέου αντικειμένου επισκέπτη παρακάτω.

Οι ταμίες του λούνα παρκ πρέπει τώρα να ελέγχουν αν ένας επισκέπτης χρειάζεται να υπογράψει μια νέα έκδοση των GTC. Για αυτό, υλοποίησε μια συνάρτηση gtcVersion που δέχεται ένα αντικείμενο επισκέπτη ως όρισμα και επιστρέφει την έκδοση των GTC αν είναι διαθέσιμη. Αν οι πληροφορίες για την έκδοση δεν είναι διαθέσιμες, δεν πρέπει να επιστραφεί τίποτα.

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
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
JavaScript Exercism

Έτοιμος να ξεκινήσεις την άσκηση Λούνα Παρκ;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.