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