जावास्क्रिप्ट में आदिम मान बनाम गैर-आदिम मान
जावास्क्रिप्ट में हमारे पास मूल्य हैं। एक मान एक चीज़ है . ऑब्जेक्ट, एरेज़, फंक्शन्स, नंबर्स, स्ट्रिंग्स और बूलियन्स सहित कई तरह के वैल्यूज हैं। मूल्यों की प्रकृति के बीच अंतर करने के लिए, हमारे पास डेटा प्रकार . नामक एक शब्द है
जावास्क्रिप्ट में दो प्रकार के डेटा प्रकार होते हैं:
- आदिम मान
- गैर-आदिम मान
ठीक है, आइए जावास्क्रिप्ट में आदिम और गैर-आदिम मानों के बीच अंतर के बारे में बात करते हैं।
आदिम मान
आदिम मूल्य संख्या, तार, बूलियन और अपरिभाषित जैसी चीजें हैं।
अपने कंसोल में निम्नलिखित आदिम मानों को प्रिंट करने का प्रयास करें:
console.log(4)
console.log('Johnny') जैसा कि आप देख सकते हैं, आदिम (सरल) मूल्यों को प्रिंट करने से आपको जो आउटपुट मिलता है, वह अनुमानित है और इसके बारे में तर्क करना कठिन नहीं है। आप अपने कंसोल से 4 प्रिंट करने के लिए कहते हैं, और आपको 4 मिलता है, आप इसे जॉनी का प्रिंट आउट लेने के लिए कहते हैं, और आपको जॉनी मिल जाता है।
उन्हें आदिम मूल्य क्यों कहा जाता है? क्योंकि वे सरल हैं (साधारण मान यदि आप मुझसे पूछें तो उनके लिए बेहतर शब्द होता)। वे इस अर्थ में सरल (आदिम) हैं कि वे डेटा मान के प्रकार हैं जिनमें गुण नहीं होते हैं - गैर-आदिम मानों के विपरीत जो अधिक "जटिल" डेटा प्रकार होते हैं, और जिनके बारे में हम एक पल में चर्चा करेंगे।पी>
गैर-आदिम मान
— उर्फ कॉम्प्लेक्स/विशेष मूल्य
जावास्क्रिप्ट में, वस्तुओं और कार्यों को गैर-आदिम मान माना जाता है।
आप कभी-कभी गैर-आदिम मानों के रूप में संदर्भित सुनेंगे:
- वस्तु संदर्भ
- जटिल डेटा प्रकार
- विशेष मूल्य
ये उन मूल्यों को संदर्भित करने के वैकल्पिक तरीके हैं जो आदिम नहीं हैं। हां, यह उन सभी समानार्थक शब्दों से परेशान है, लेकिन आपको उनके बारे में पता होना चाहिए। आप वेब पर इस विषय से संबंधित संपूर्ण लेख पढ़ सकते हैं, जो इनमें से केवल एक शब्द का उपयोग करता है। थोड़ी देर बाद आप एक अलग लेखक द्वारा एक लेख पढ़ेंगे जो दूसरे शब्द का उपयोग करता है, और फिर आपको आश्चर्य होगा कि क्या आप उसी भाषा के बारे में भी पढ़ रहे हैं।
आदिम मूल्यों के विपरीत, गैर-आदिम मान करते हैं गुण होते हैं,
ऑब्जेक्ट्स
निम्नलिखित को अपने कंसोल में प्रिंट करने का प्रयास करें:
console.log({})
console.log([]) क्या आप इस आउटपुट के बारे में पहले के आदिम मूल्य उदाहरणों की तुलना में कुछ अलग देखते हैं?
हम इन आउटपुट पर क्लिक और विस्तार कर सकते हैं। प्रत्येक आउटपुट के आगे वाले तीर पर क्लिक करने का प्रयास करें (बस प्रत्येक पर एक बार क्लिक करें) और देखें कि क्या होता है।
आह, अब प्रत्येक का एक नाम है। पहले को ऑब्जेक्ट, . कहा जाता है दूसरे को सरणी . कहा जाता है
नोट:यदि आप फ़ायरफ़ॉक्स का उपयोग कर रहे हैं, तो हो सकता है कि आपको डेटा प्रकार का अनावरण करने के लिए तीर पर क्लिक न करना पड़े।
उपरोक्त दोनों वस्तुएँ हैं। एक सरणी जावास्क्रिप्ट में एक प्रकार की वस्तु है - एक सरणी वस्तु - लेकिन यह नियमित वस्तुओं की तुलना में अलग-अलग काम कर सकती है।
यह साबित करने के लिए कि जावास्क्रिप्ट में सरणियाँ वास्तव में वस्तुएँ हैं, typeof . चलाएँ ऊपर के उदाहरणों पर ऑपरेटर, इस तरह:
console.log(typeof {}) // object
console.log(typeof []) // object हाँ, वे दोनों वस्तुएँ हैं।
ठीक है, अब अपनी वस्तु और सरणी वस्तु के आगे वाले तीरों पर फिर से क्लिक करने का प्रयास करें, और देखें कि क्या होता है।
पवित्र बकवास, अब चीजें इतनी सरल नहीं लगतीं, है ना?
आपने जो खुलासा किया है, वे सभी अलग-अलग संपत्ति प्रकार हैं जिनमें क्रमशः नियमित वस्तुएं और सरणियाँ (एक प्रकार की वस्तु) होती हैं।
अभी इनमें से किसी भी चीज़ को समझने के बारे में चिंता न करें, मेरी बात केवल आपको यह दिखाने के लिए है कि वस्तुएं साधारण मूल्य प्रकार नहीं हैं (वे गैर-आदिम हैं) ) क्योंकि वे आदिम मूल्यों के विपरीत बहुत कुछ कर सकते हैं।
Functions
अब तक आपने ऑब्जेक्ट देखे हैं (नियमित ऑब्जेक्ट {} और सरणी ऑब्जेक्ट [] ), अब आइए कार्यों पर एक नज़र डालें। निम्नलिखित को अपने कंसोल में प्रिंट करने का प्रयास करें:
console.log(function doSomething() { }) यदि आप क्रोम का उपयोग कर रहे हैं, तो शायद आपको विस्तार योग्य आउटपुट नहीं मिलेगा - मुझे नहीं पता कि Google/क्रोम ने इसे इस तरह क्यों डिजाइन किया है। फिर भी यदि आप फ़ायरफ़ॉक्स, . में उपरोक्त पंक्ति को प्रिंट करने का प्रयास करते हैं आपको इस तरह एक विस्तृत आउटपुट मिलेगा:
जैसा कि आप देख सकते हैं कि फ़ंक्शंस में गुण भी होते हैं लेकिन ऑब्जेक्ट से भिन्न प्रकार के होते हैं।
arguments: null— हमारे पास(). के अंदर कोई तर्क/पैरामीटर नहीं है ।caller: null— हम फ़ंक्शन को कहीं से भी कॉल नहीं करते हैंlength: 0हमारे पास कोई तर्क (शून्य) नहीं है।name: "doSomething"— हमारे समारोह का नाम।
आपके पास prototype: Object . तक भी पहुंच है और <prototype>: function () जो कार्यों के बारे में बहुत अधिक जानकारी का अनावरण करेगा, जैसा आपने पहले वस्तुओं के साथ देखा था।
रुको, यह क्यों कहता है prototype: Object ? क्या किसी फ़ंक्शन को ऑब्जेक्ट माना जाता है?
जावास्क्रिप्ट में, प्रत्येक गैर-आदिम मान प्रकार को कुछ हद तक एक वस्तु माना जाता है, जिसमें फ़ंक्शन (और सरणियाँ, जैसा कि आपने पहले देखा था) शामिल हैं। अधिक विशेष रूप से, जावास्क्रिप्ट में, एक फ़ंक्शन एक फ़ंक्शन ऑब्जेक्ट है — एक विशेष प्रकार की वस्तु जिसे () . के साथ बुलाया जा सकता है सिंटैक्स, जैसा कि आपने doSomething() . में देखा था उदाहरण।
अब यह शायद आपके लिए अधिक समझ में आता है कि मैंने पहले क्यों उल्लेख किया कि गैर-आदिमों को कभी-कभी वस्तु संदर्भ के रूप में संदर्भित किया जाता है।
typeof the चलाने का प्रयास करें अपने फ़ंक्शन पर ऑपरेटर और देखें कि क्या होता है:
console.log(function doSomething() {})
यह function . आउटपुट करता है ...
क्या आप इससे हैरान हैं?
यदि जावास्क्रिप्ट में सब कुछ एक वस्तु है, तो यह function क्यों आउटपुट करता है? प्रकार के रूप में?
खैर, पहले के स्क्रीनशॉट को फिर से देखें:
यह कहता है कि फ़ंक्शन में फ़ंक्शन प्रोटोटाइप और ऑब्जेक्ट प्रोटोटाइप दोनों हैं।
क्या होता है, और मैं इसे स्पष्ट कर दूं, जैसा कि मैं इसे समझता हूं यह है कि जावास्क्रिप्ट में फ़ंक्शन प्रोटोटाइप ऑब्जेक्ट प्रोटोटाइप से विरासत में मिलता है।
तो एक फ़ंक्शन वास्तव में इसका अपना विशेष डेटा प्रकार मान (अपने स्वयं के प्रोटोटाइप के साथ) होता है और इसे इस तरह माना जाना चाहिए क्योंकि यह नियमित वस्तुओं की तुलना में अलग-अलग चीजें कर सकता है। लेकिन एक फ़ंक्शन की जड़ें तथाकथित ऑब्जेक्ट प्रोटोटाइप में होती हैं, इसलिए भले ही यह अपनी चीज़ हो, फिर भी यह ऑब्जेक्ट छतरी के नीचे आती है।
सारांश
वस्तुओं और कार्यों के साथ हमारे पास विकल्पों की विस्तृत श्रृंखला के कारण हम उन्हें गैर-आदिम डेटा प्रकार ("जटिल") कहते हैं आदिम डेटा प्रकार (“सरल”) . के विपरीत जैसे संख्या और तार, जिनकी तुलना में सीमित विकल्प हैं।