nu

null और undefined में JavaScript

1 अभ्यास

null और undefined के बारे में

बाकी कई भाषाओं के उलट, JavaScript में दो अलग-अलग चीज़ें हैं जो किसी (अर्थपूर्ण) वैल्यू के न होने को दर्शाती हैं। ये हैं null और undefined।

null

प्रिमिटिव वैल्यू null का उपयोग किसी वेरिएबल के लिए जानबूझकर रखी गई "खाली वैल्यू" के रूप में किया जाता है। दूसरी भाषाओं में इस जैसा कोई तरीका सिर्फ (गायब) ऑब्जेक्ट या पॉइंटर टाइप के लिए इस्तेमाल किया जा सकता है। JavaScript में null आम तौर पर किसी भी टाइप के लिए खाली वैल्यू दर्शाता है।

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

आप सख्त समानता ऑपरेटर === की मदद से देख सकते हैं कि कोई वेरिएबल null है या नहीं। हालाँकि null एक प्रिमिटिव वैल्यू है, फिर भी typeof ऑपरेटर ऐतिहासिक कारणों से "गलत तरीके से" object लौटाता है। इसका मतलब है कि सिर्फ इसी से यह नहीं देखा जा सकता कि कोई वेरिएबल null है या नहीं।

let name = null;

name === null;
// => true

// Pitfall:
typeof name;
// => 'object'

undefined

जिस वेरिएबल को कोई वैल्यू असाइन नहीं किया गया है, उसका टाइप undefined होता है।1

इसका मतलब है कि null किसी खाली वैल्यू को दर्शाता है (जो फिर भी एक वैल्यू है), जबकि undefined वैल्यू के बिल्कुल न होने को दर्शाता है। 🤯

undefined अलग-अलग जगहों पर सामने आता है।

  • अगर किसी वेरिएबल को बिना कोई वैल्यू दिए (इनिशियलाइज़ेशन के बिना) घोषित किया जाए, तो वह undefined होता है।
  • अगर आप किसी ऑब्जेक्ट में ऐसी की की वैल्यू पढ़ने की कोशिश करें जो मौजूद नहीं है, तो आपको undefined मिलता है।
  • अगर कोई फंक्शन कोई वैल्यू नहीं लौटाता, तो परिणाम undefined होता है।
  • अगर किसी फंक्शन को कोई आर्गुमेंट पास नहीं किया जाता, तो वह undefined होता है, सिवाय इसके कि उस आर्गुमेंट की कोई डिफ़ॉल्ट वैल्यू हो।
let name;
console.log(name);
// => undefined

let obj = { greeting: 'hello world' };
console.log(obj.missingKey);
// => undefined

function returnNothing() {
  return;
}
console.log(returnNothing());
// => undefined

आप सख्त समानता ऑपरेटर === या typeof ऑपरेटर की मदद से देख सकते हैं कि कोई वेरिएबल undefined है या नहीं।

let name;

name === undefined;
// => true

typeof name === 'undefined';
// => true

किसी वेरिएबल को खुद से undefined असाइन करना सलाह नहीं दी जाती; इसके बजाय हमेशा null इस्तेमाल कीजिए, ताकि साफ रहे कि आपने जानबूझकर एक खाली वैल्यू सेट की है।

ऑप्शनल चेनिंग

जैसा ऊपर बताया गया, JavaScript में किसी ऑब्जेक्ट की मौजूद न होने वाली की पढ़ने पर undefined मिलता है। लेकिन अगर आप कोई नेस्टेड वैल्यू निकालने की कोशिश करें और उसकी पैरेंट की मौजूद न हो, तो नेस्टेड की को undefined पर पढ़ा जाता है और यह TypeError: Cannot read property ... of undefined देता है। सैद्धांतिक रूप से, नेस्टेड की निकालने से पहले आपको हमेशा यह देखना पड़ता कि पैरेंट की मौजूद है या नहीं। ऐसा अक्सर AND ऑपरेटर && से किया जाता था, लेकिन गहराई तक नेस्टेड वैल्यू के लिए इससे बहुत लंबे एक्सप्रेशन बन जाते हैं।

obj.level1 && obj.level1.level2 && obj.level1.level2.level3;

इस समस्या को हल करने के लिए 2020 में भाषा के स्पेसिफिकेशन में ऑप्शनल चेनिंग को जोड़ा गया। ऑप्शनल चेनिंग ऑपरेटर ?. की मदद से आप यह पक्का कर सकते हैं कि JavaScript नेस्टेड की को तभी पढ़ने की कोशिश करे जब उसकी पैरेंट null या undefined न हो। वरना undefined लौटाया जाता है।

const obj = {
  address: {
    street: 'Trincomalee Highway',
    city: 'Batticaloa',
  },
};

obj.residence;
// => undefined

obj.address.zipCode;
// => undefined

obj.residence.street;
// => TypeError: Cannot read property 'street' of undefined

obj.residence?.street;
// => undefined

obj.residence?.street?.number;
// => undefined

नलिश कोलेसिंग

कुछ ऐसी स्थितियाँ होती हैं जहाँ आप कोई डिफ़ॉल्ट वैल्यू लगाना चाहते हैं, अगर कोई वेरिएबल null या undefined हो। पहले ऐसा अक्सर टर्नरी ऑपरेटर ? से या OR ऑपरेटर || के लेज़ी इवैल्यूएशन से किया जाता था। इसमें यह कमी है कि डिफ़ॉल्ट वैल्यू हर उस हाल में लग जाती है जब वेरिएबल फॉल्सी हो (जैसे '' या 0), न कि सिर्फ तब जब वह null या undefined हो। इससे आसानी से अनचाहे नतीजे आ सकते हैं।

let amount = null;
amount = amount || 1;
// => 1

amount = 0;
amount = amount || 1;
// => 1

amount = 0;
amount ? amount : 1;
// => 1

इसे ठीक करने के लिए नलिश कोलेसिंग ऑपरेटर ?? पेश किया गया। ऑप्शनल चेनिंग की तरह इसे भी 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 को देखा गया)।

GitHub के ज़रिए संपादित करें यह लिंक नई विंडो या टैब में खुलता है।

null और undefined सीखिए