ट्रैक
/
JavaScript
JavaScript
/
अभ्यास
/
मनोरंजन पार्क
मनोरंजन पार्क

मनोरंजन पार्क

सीखने का अभ्यास

परिचय

बाकी कई भाषाओं के उलट, 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 को देखा गया)।

निर्देश

आपको एक मनोरंजन पार्क के IT सिस्टम के कुछ हिस्से उपलब्ध कराने और उन्हें बनाए रखने हैं। खास तौर पर, विज़िटरों और टिकटों को संभालने वाले प्रोग्राम की ज़िम्मेदारी आपकी है।

सबसे पहले आप सिस्टम में एक नया विज़िटर बनाएँगे। फिर आप टिकट रद्द करने के लिए एक फंक्शन बनाएँगे। काम 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 लिखिए, जो काम 3 के ticketStatus जैसे ही आर्गुमेंट लेता है। यह फंक्शन सिर्फ दो में से एक परिणाम लौटाता है।

  • विज़िटर का नाम, अगर टिकट बिक गया हो
  • '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 अभ्यास तथा असली इंसानों से मिलने वाली मेंटरिंग के साथ सीखिए और उसमें महारत हासिल कीजिए, वह भी बिल्कुल मुफ्त।