जावास्क्रिप्ट में वास्तव में अपरिभाषित का क्या मतलब है? ऐसा क्यों है? इसका क्या उपयोग है? यह कैसे उपयोगी हो सकता है?


11

जावास्क्रिप्ट में, हमारे पास अपरिभाषित कुछ है । मैंने कुछ कहा, क्योंकि मैं वास्तव में नहीं जानता कि क्या यह एक आधार वर्ग, या एक अंतर्निहित चर, या एक कीवर्ड, या कुछ और है। मुझे सिर्फ इतना पता है कि यह वहां है।

इसे कार्रवाई में देखने के लिए, आप बस लिख सकते हैं:

undefined;
typeof undefined;

क्या कोई मुझे समझा सकता है कि इस चीज़ को जावास्क्रिप्ट में क्यों डाला गया है? nullइस भाषा में हमारा मूल्य है, इस प्रकार यह कुछ ऐसा नहीं होना चाहिए null। अन्य भाषाओं में, जब हमें किसी प्रॉपर्टी या वैरिएबल का मूल्य नहीं पता होता है, तो हम बस इसे शून्य करने के लिए सेट करते हैं। यहां हम वही काम कर सकते हैं।

हम जावास्क्रिप्ट में इस चीज का उपयोग कैसे कर सकते हैं ?



इस विज्ञापन पर चर्चा की गई थी यहाँ stackoverflow.com/questions/6999291/…
पॉल

जवाबों:


13

वहाँ दो चीजें आप अपरिभाषित के बारे में समझने की जरूरत है ...

  • प्रकार undefined है कि केवल हो सकता है एक मूल्य
  • परिवर्तनशील undefined

अब निम्नलिखित को बहुत ध्यान से पढ़ें ...

  • प्रकार number(10, 10.01, 1e1) के बहुत सारे मूल्य हैं । लेकिन केवल एक प्रकार का मूल्य हो सकता है undefined, और यह मान चर में संग्रहीत होता है undefinedयही कारण है कि मूल्य नहीं शाब्दिक प्रतिनिधित्व है - उदाहरण के लिए, संख्या मान 1, 100, 1e-1प्रकार संख्या के सभी शाब्दिक हैं, लेकिन चर में संग्रहीत मूल्य undefinedनहीं शाब्दिक रूप है।

  • undefinedएक वैरिएबल है, बस एक सामान्य वैरिएबल है, जिसे जावास्क्रिप्ट घोषित करता है और इसे undefinedवैश्विक दायरे में टाइप का मान बताता है । तो आप निम्नलिखित सभी कर सकते हैं ...

  टाइपऑफ़ अपरिभाषित; // "अपरिभाषित"

  अपरिभाषित = 100;
  टाइपऑफ़ अपरिभाषित; // "संख्या"

  अपरिभाषित = शून्य;
  टाइपऑफ़ अपरिभाषित; // "अपरिभाषित"

  window.undefined === अनिर्धारित; // सच
  window.undefined === void 0; // सच
  
  • यदि आप चर का उपयोग नहीं करना चाहते हैं undefined, तो आप undefinedअभिव्यक्ति के प्रकार का मान उत्पन्न कर सकते हैं void 0- जिसका एकमात्र उद्देश्य प्रकार के मूल्य को वापस करना है undefined

... क्या कोई मुझे समझा सकता है कि यह बात जावास्क्रिप्ट में क्यों डाली गई है ...

नहीं। जैसे कोई यह नहीं समझा सकता है कि अघोषित चर स्थानीय के बजाय वैश्विक दायरे में क्यों जाते हैं। आपको अस्तित्व के लिए औचित्य खोजने की कोशिश करने के बजाय स्मार्ट तरीके से खुद को प्रशिक्षित करने की आवश्यकता है।

... हमारे पास शून्य मान है ...

हालांकि nullचीजें कर सकती हैं undefined, यह कम या ज्यादा संबंधित है, objectsबजाय स्केलर के। वास्तव में, जावास्क्रिप्ट nullअपने आप को एक वस्तु मानता है - typeof null"वस्तु" लौटाता है।

मेरी राय में, लब्बोलुआब यह कारण करने का पूर्ण उद्देश्यों की कोशिश नहीं है undefinedऔर nullहै कि अपने कोड, पठनीय पोषणीय और पुन: प्रयोज्य है और बुद्धिमानी से अपने कोड में उन्हें इस्तेमाल, इसलिए -।


2
अच्छी व्याख्या @greengit। the bottom line is to NOT try to reason the absolute purposes of undefined and null, ऐसा लगता है कि जावास्क्रिप्ट एक तार्किक भाषा होने से बहुत दूर है और हमें बस एक नई दुनिया के प्रयोग की तरह इसका उपयोग करना होगा।
सईद नेमाटी

1
"जिसका एकमात्र उद्देश्य प्रकार के मूल्य को वापस करना है undefined"। वास्तव में voidएक अभिव्यक्ति का मूल्यांकन करता है, वापसी मूल्य की उपेक्षा करता है और मूल्य लौटाता है undefined। अंतर के रूप में। undefinedजेएस इंजन द्वारा यह कहने के लिए उपयोग किया जाता है कि इस चीज का कोई मूल्य नहीं है। nullद्वारा किया जाता है आप इस बात कोई मूल्य नहीं है कहने के लिए। वहाँ एक है स्पष्ट भेद।
रेयनोस

1
undefined = 100; typeof undefined;मेरे लिए "अपरिभाषित" रिटर्न देता है, यदि आप एक त्रुटि पाने के लिए टालने की कोशिश करते हैं। बस यह स्पष्ट करना चाहता था कि भविष्य के पाठकों के लिए।
जोश रंबुट

6

एक पुराने प्रश्न का उत्तर देने के लिए क्षमा करें, लेकिन जिस कारण से आपको अपरिभाषित और अशक्त दोनों की आवश्यकता है, वह सरल है: एक प्रोटोटाइप-आधारित डक-टाइपिंग भाषा में, आपको "इस ऑब्जेक्ट को X के लिए मान नहीं" और "इस ऑब्जेक्ट" X के बीच अंतर करना होगा। कुछ भी नहीं / बातिल / खाली "।

इस क्षमता के बिना प्रोटोटाइप श्रृंखला को चलाने का कोई तरीका नहीं है और इसलिए विरासत काम नहीं कर सकती है; आपको यह निर्धारित करने में सक्षम होना चाहिए कि obj.someProp अपरिभाषित है, इसलिए आप obj.prototype.someProp को देख सकते हैं, और जब तक आपको मूल्य नहीं मिल जाता है, तब तक श्रृंखला को आगे बढ़ा सकते हैं। अगर obj.someProp अशक्त हो गया, तो यह जानने का कोई तरीका नहीं होगा कि क्या यह वास्तव में अशक्त था या इसका मतलब था "मेरे प्रोटोटाइप को देखो"। इसके चारों ओर एकमात्र तरीका पर्दे के पीछे के कुछ जादू के जादू को इंजेक्ट करना है जो प्रोटोटाइप श्रृंखलाओं के साथ फ़ज़ करने की आपकी क्षमता को तोड़ता है और जेएस काले जादू के विभिन्न अन्य बिट्स को करता है।

बहुत से जावास्क्रिप्ट की तरह, अपरिभाषित और अशक्त का विचार पहली बार में विजयी और मूर्ख लगता है, फिर बाद में बिल्कुल शानदार (फिर से वापस पागल और बेवकूफ लेकिन एक उचित विवरण के साथ)।

यदि आप किसी ऐसी संपत्ति का उपयोग नहीं करते हैं, जो C # जैसी भाषा संकलित नहीं करेगी और अन्य गतिशील भाषाएं अक्सर रनटाइम पर अपवादों को फेंक देती हैं, जब आप ऐसी संपत्ति को छूते हैं जो अस्तित्व में नहीं होती है, जिसका अर्थ है कि आपको उनके लिए परीक्षण करने के लिए विशेष निर्माणों का उपयोग करना होगा। प्लस क्लासेस का मतलब है जब कोई वस्तु तुरंत तैयार की जाती है तो आपको पहले से ही इसकी विरासत श्रृंखला और इसके सभी गुणों के बारे में पता होता है - जेएस में मैं श्रृंखला के 15 चरणों में एक प्रोटोटाइप को संशोधित कर सकता हूं और जो परिवर्तन मौजूदा वस्तुओं पर दिखाई देंगे।


3

एक वैश्विक चर है undefined, जो अपरिभाषित मूल्य पर सेट है। दुष्ट लोग इसे किसी और चीज़ के लिए सेट कर सकते हैं, इसलिए शायद इस पर भरोसा न करना सबसे अच्छा है।

  • अपरिभाषित मान किसी फ़ंक्शन का रिटर्न मान है जो मान वापस नहीं करता है।
  • अपरिभाषित मान एक चर का मान है जिसे असाइन नहीं किया गया है।
  • अपरिभाषित मान एक पैरामीटर का मान है जिसे पारित नहीं किया गया है।
  • अपरिभाषित मूल्य एक संपत्ति का मूल्य है जिसे असाइन नहीं किया गया है।
  • 'अपरिभाषित ’एक अघोषित चर का प्रकार है। () typeof undeclaredVariable == 'undefined'एक अपरिभाषित चर के मूल्य को पढ़ने की कोशिश करने से आपको एक फेंक मिलेगा ReferenceError।)

nullआसानी से टूट गया है, क्योंकि typeof null == 'object'। मुझे नहीं पता कि हमारे पास undefinedऔर क्यों null, शायद कुछ ऐतिहासिक दुर्घटना है।


2

खैर, undefinedएक प्रहरी मूल्य है जो किसी ऐसी चीज का मूल्यांकन करके प्राप्त किया जाता है जिसका विरोध नहीं किया जाता है null, जो कि किसी भी चीज का प्रतिनिधित्व करने के लिए बिल्कुल परिभाषित मूल्य है ।

var o = { };
> undefined
o
> Object {}
o.foo
> undefined
function f() {}
> undefined
function r() { return null; }
> undefined
f()
> undefined
r()
> null

उदाहरण के लिए, किसी फ़ंक्शन का रिटर्न मान, जो रिटर्न वैल्यू को परिभाषित नहीं करता है, अपरिभाषित है। किसी वस्तु पर परिभाषित नहीं की गई संपत्ति का मूल्य अपरिभाषित है। किसी कथन का रिटर्न मान, जो कि एक अभिव्यक्ति नहीं है, अपरिभाषित है (हालाँकि आप यह नहीं देखेंगे कि यह कंसोल के अलावा होता है)।
कृपया ध्यान दें, आप एक फ़ंक्शन बना सकते हैं, जो स्पष्ट रूप से देता है undefinedऔर आप किसी संपत्ति को किसी वस्तु के मूल्य के साथ स्पष्ट रूप से परिभाषित कर सकते हैं undefined, क्योंकि अंत में यह एक वैध मूल्य है। आप स्पष्ट रूप से संवाद करने के लिए ऐसा करेंगे, ताकि कुछ परिभाषित न हो

आप के रिश्ते के बारे में सोच सकता है undefinedऔर nullके बीच के रूप में NaNऔर 0


"किसी फ़ंक्शन का रिटर्न मान, जो रिटर्न वैल्यू को परिभाषित नहीं करता है, अपरिभाषित है", क्या आपका मतलब undefinedहै void?
सईद नेमाटी

@ सईद: काफी नहीं। voidजावास्क्रिप्ट में एक यूनरी ऑपरेटर है , जो किसी भी तर्क को लेता है और मूल्य को लौटाता हैundefined
back2dos
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.