Vidámpark

Vidámpark

Tanulófeladat

Bevezetés

Sok más nyelvvel ellentétben a JavaScriptben két különböző dolog is jelöli egy (értelmes) érték hiányát. Van a null és az undefined.

Null

A null primitív értéket szándékos „üres értékként” használjuk bármilyen típusú változóhoz.

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

Azt, hogy egy változó null-e, a szigorú egyenlőség operátor === segítségével ellenőrizheted.

let name = null;

name === null;
// => true

Undefined

Az a változó, amelynek nem adtunk értéket, undefined típusú.1

Ez azt jelenti, hogy míg a null egy üres értéket jelöl (de mégiscsak egy értéket), addig az undefined egy érték teljes hiányát jelöli. 🤯

Az undefined többféle helyzetben is megjelenik.

  • Ha egy változót érték nélkül deklarálunk (kezdőérték nélkül), akkor az undefined lesz.
  • Ha egy objektumban egy nem létező kulcshoz próbálsz hozzáférni, undefined-et kapsz.
  • Ha egy függvény nem ad vissza értéket, az eredmény undefined.
  • Ha egy argumentumot nem adunk át egy függvénynek, az undefined lesz, kivéve, ha az argumentumnak van alapértelmezett értéke.
let name;
console.log(name);
// => undefined

Azt, hogy egy változó undefined-e, a szigorú egyenlőség operátor === segítségével ellenőrizheted.

let name;

name === undefined;
// => true

Opcionális láncolás

Ha megpróbálsz lekérni egy egymásba ágyazott értéket egy objektumból, de a szülő kulcs nem létezik, a JavaScript hibát dob. Ennek egyszerű elkerülésére 2020-ban bekerült a nyelvi specifikációba az opcionális láncolás. Az opcionális láncolás operátorral ?. elérheted, hogy a JavaScript csak akkor próbálja meg elérni az egymásba ágyazott kulcsot, ha a szülő nem null és nem undefined. Ellenkező esetben undefined-et ad vissza.

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

Nullish coalescing

Vannak olyan helyzetek, amikor alapértelmezett értéket szeretnél alkalmazni, ha egy változó null vagy undefined (de csak akkor). Ennek kezelésére 2020-ban bevezették a nullish coalescing operátort ??. Csak akkor adja vissza a jobb oldali operandust, ha a bal oldali operandus null vagy undefined. Ellenkező esetben a bal oldali operandust adja vissza.

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 (megtekintve: 2021. június 4.).

Utasítások

A te feladatod, hogy egy vidámpark informatikai rendszerének egyes részeit biztosítsd és karbantartsd. Konkrétan a látogatókat és a jegyeket kezelő programért felelsz.

Először létrehozol egy új látogatót a rendszerben. Utána készítesz egy függvényt a jegy visszavonásához. A 3. és 4. feladatban a jegyek nyomon követését segítő rendszeren dolgozol, amely hozzájárul a hamisítás megelőzéséhez. Végül segítesz a rendszert az új jogi követelményekhez igazítani.

1. Új látogató létrehozása

Amikor a látogatók először jönnek a vidámparkba, regisztrálniuk kell: be kell írniuk a nevüket és az életkorukat egy terminálba, majd el kell fogadniuk a szerződési feltételeket. Természetesen jegyet is kell venniük. Minden jegynek van egy azonosítója, például H32AZ123.

Írj egy createVisitor függvényt, amely három argumentumot fogad.

  • A látogató neve.
  • A látogató életkora.
  • A megvásárolt jegy azonosítója.

A függvény egy objektumot adjon vissza, amely ezt az információt tartalmazza. Az objektum kulcsai name, age és ticketId legyenek.

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

2. A jegy visszavonása

Amikor az emberek elhagyják a vidámparkot, a jegyük visszavonásra kerül. Ha visszajönnek, új jegyet kell venniük. Hogy a törzsvendégeknek időt spóroljunk, csak egyszer kell regisztrálniuk, és a látogató adatait a későbbi látogatásokhoz is megőrizzük.

Ez azt jelenti, hogy amikor egy látogató elhagyja a parkot, csak a jegyét kell érvényteleníteni, a látogató objektum többi része viszont változatlan marad. Valósítsd meg a revokeTicket függvényt, amely egy látogató objektumot fogad, a jegy azonosítóját null-ra állítja, majd visszaadja az objektumot.

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

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

3. A jegy állapotának meghatározása

A hamisítás megelőzése érdekében a jegyazonosítók egyediek. Amint egy jegyet kinyomtatnak, az azonosítója kulcsként bekerül a rendszer egyik objektumába, hogy nyomon lehessen követni.

Mielőtt a jegyet eladják egy látogatónak, null értékkel kerül be a jegynyilvántartó objektumba. Amikor eladják egy látogatónak, értékként a látogató nevét kapja. Amikor a dolgozóknak kétségük van egy jegy érvényességéről, le kell ellenőrizniük a jegy állapotát a rendszerben.

Valósítsd meg a ticketStatus függvényt, amely a nyilvántartó objektumot és egy jegyazonosítót fogad argumentumként. A következő eredmények egyikét adja vissza.

  • 'unknown ticket id', ha az azonosító nem található a nyilvántartó objektumban
  • 'not sold', ha a jegyet kinyomtatták, de nem adták el
  • 'sold to {name}', ahol {name} a látogató neve, ha a jegyet eladták
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. A jegy állapotára adott válasz javítása

Egy idő után visszajelzést kapsz a dolgozóktól, hogy szeretnék, ha a jegy állapota első pillantásra könnyebben érthető lenne. Csak a látogató nevét szeretnék látni, vagy azt, hogy a jegy érvénytelen.

Írj egy simpleTicketStatus függvényt, amely ugyanazokat az argumentumokat fogadja, mint a 3. feladat ticketStatus függvénye. Ez a függvény csak két különböző eredmény egyikét adja vissza.

  • a látogató nevét, ha a jegyet eladták
  • 'invalid ticket !!!', ha a jegyet még nem adták el, vagy az azonosító nem található a nyilvántartó objektumban
const tickets = {
  '0H2AZ123': null,
  '23LA9T41': 'Verena Nardi',
};

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

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

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

5. Az általános szerződési feltételek verziójának meghatározása

Az új jogi követelmények miatt az újonnan létrehozott látogatóobjektumok mostantól részletes információt is tartalmaznak az „Általános Szerződési Feltételekről” (GTC), amelyeket a felhasználó elfogadott. Alább láthatsz egy példát az új látogatóobjektumra.

A vidámpark pénztárosainak mostantól ellenőrizniük kell, hogy egy látogatónak alá kell-e írnia a GTC egy új verzióját. Ehhez valósítsd meg a gtcVersion függvényt, amely egy látogató objektumot fogad argumentumként, és visszaadja a GTC verzióját, ha az elérhető. Ha a verzióinformáció nem érhető el, semmit sem szabad visszaadni.

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
Szerkesztés GitHubon A hivatkozás új ablakban vagy lapon nyílik meg
JavaScript Exercism

Készen állsz elkezdeni a(z) Vidámpark feladatot?

Iratkozz fel az Exercism-re, hogy megtanuld és elsajátítsd a(z) JavaScript nyelvet 37 fogalom159 feladat segítségével, valódi emberi mentorálással, mindez ingyen.