Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> JavaScript

JavaScript में प्रिमिटिव वैल्यूज़ इम्यूटेबल हैं का क्या अर्थ है?

JavaScript में, आप अक्सर सुनेंगे कि प्रिमिटिव वैल्यूज़ इम्यूटेबल (अपरिवर्तनीय) होती हैं, नॉन-प्रिमिटिव वैल्यूज़ के विपरीत, जो म्यूटेबल (परिवर्तनीय) होती हैं। इन वैल्यू टाइप्स (जिन्हें डेटा टाइप्स भी कहा जाता है) के बीच अंतर समझना महत्वपूर्ण है क्योंकि यह आपको भविष्य में बहुत सारी परेशानियों से बचाएगा।

प्रिमिटिव वैल्यूज़ हैं:

  • नंबर्स
  • स्ट्रिंग्स
  • बूलियन्स

नॉन-प्रिमिटिव वैल्यूज़ हैं:

  • ऑब्जेक्ट्स
  • फंक्शन्स

म्यूटेबल का अर्थ है इसे बदला जा सकता है।

इम्यूटेबल का अर्थ है इसे नहीं बदला जा सकता।

नॉन-प्रिमिटिव वैल्यूज़ म्यूटेबल हैं

निम्नलिखित लोगों की एक सूची (ऐरे) है जिसे एक वेरिएबल को असाइन किया गया है:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph']

अब मैं अपनी सूची को म्यूटेट करना चाहता हूँ। म्यूटेट का सीधा सा अर्थ है बदलना। मैं अर्नोल्ड को जीन-क्लॉड से बदलना चाहता हूँ, और परिणाम प्रिंट करना चाहता हूँ:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph'] peopleList[0] = 'Jean-Claude' console.log(peopleList)

यह काम कर गया! हमने बस एक मौजूदा वैल्यू पर म्यूटेशन किया। इस मामले में, मौजूदा वैल्यू एक ऐरे (सूची) थी, या अधिक विशेष रूप से, एक ऐरे ऑब्जेक्ट।

JavaScript में, नॉन-प्रिमिटिव वैल्यूज़ म्यूटेबल (परिवर्तनीय) होती हैं।

प्रिमिटिव वैल्यूज़ इम्यूटेबल हैं

निम्नलिखित एक टेक्स्ट (स्ट्रिंग) वैल्यू है जिसे एक वेरिएबल को असाइन किया गया है:

let person = 'Ernold'

अरे, दुर्भाग्य से, हमने अर्नोल्ड की स्पेलिंग गलत लिख दी, उसके नाम के पहले अक्षर में A के बजाय E का उपयोग करके। आइए इसे जल्दी से ठीक करें और परिणाम प्रिंट करें:

let person = 'Ernold' person[0] = 'A' console.log(person) // output: Ernold

रुको, क्या? यह "Ernold" क्यों प्रिंट कर रहा है? क्या हमने अभी E को A से स्वैप नहीं किया था!?

नहीं, क्योंकि हम जिस वैल्यू को म्यूटेट करने की कोशिश कर रहे हैं वह एक स्ट्रिंग है, जो एक प्रिमिटिव वैल्यू है — और सभी प्रिमिटिव वैल्यूज़ इम्यूटेबल (अपरिवर्तनीय) होती हैं।

केवल नॉन-प्रिमिटिव वैल्यूज़ (ऑब्जेक्ट्स और फंक्शन्स) म्यूटेबल होती हैं।

भ्रमित?

आपकी JavaScript सीखने की यात्रा की शुरुआत में इस सामान के बारे में भ्रमित होना पूरी तरह से सामान्य है क्योंकि सतह पर उपरोक्त उदाहरण कुछ स्थितियों में समान दिखते और व्यवहार करते हैं — कुछ स्थितियों में।

आइए पहले के अपने ऐरे से पहला नाम प्रिंट करें:

let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph'] console.log(peopleList[0]) // output: "Arnold"

वहां कोई आश्चर्य नहीं, यह "Arnold" प्रिंट करता है।

अब आइए पहले के अपने स्ट्रिंग (गलत स्पेलिंग वाला नाम) से पहला अक्षर प्रिंट करें:

let person = 'Ernold' console.log(person[0]) // output: ??

आपको क्या लगता है क्या होगा?

...

...

यह काम कर गया! यह "E" प्रिंट करता है!

क्या आपने उपरोक्त के काम न करने की उम्मीद की थी?

किसी भी तरह, यहां महत्वपूर्ण सबक यह है कि आप एक्सेस कर सकते हैं एक प्रिमिटिव वैल्यू को उसी तरह से जैसे आप नॉन-प्रिमिटिव वैल्यूज़ को एक्सेस करते हैं, लेकिन आप इसे बदल (म्यूटेट) नहीं सकते। यही बड़ा अंतर है (एक्सेस बनाम म्यूटेट)।

JavaScript में, प्रिमिटिव वैल्यूज़ रीड-ओनली होती हैं, जबकि नॉन-प्रिमिटिव वैल्यूज़ (ऑब्जेक्ट्स/ऐरे, फंक्शन्स) दोनों रीड एंड राइट होती हैं।

यही कारण है कि हम पहले अपने ऐरे के पहले आइटम वैल्यू को Arnold से Jean-Claude में बदल (म्यूटेट) सके, लेकिन हम "Ernold" से "Arnold" तक एक साधारण स्पेलिंग एरर को ठीक नहीं कर सकते — क्योंकि यह एक स्ट्रिंग है, और स्ट्रिंग्स/प्रिमिटिव वैल्यूज़ इम्यूटेबल हैं।

वेरिएबल्स बनाम वैल्यूज़

(मुझे पता है कि आप में से कुछ क्या सोच रहे हैं)

भले ही हमने अभी निष्कर्ष निकाला कि प्रिमिटिव वैल्यूज़ इम्यूटेबल हैं, मैं अभी भी "Ernold" की स्पेलिंग गलती को ठीक करने के लिए दृढ़ हूँ। आइए कुछ नया आज़माएं!

निम्न कोड को देखें (इसे ध्यान से पढ़ें):

let person = 'Ernold' person = 'Arnold' console.log(person) // output: ??

प्रिमिटिव वैल्यूज़, जैसे स्ट्रिंग्स, के बारे में आपने जो सीखा है, उसे ध्यान में रखते हुए, क्या आपको लगता है कि उपरोक्त Arnold प्रिंट करेगा, हां या नहीं?

...

(इसके बारे में सोचें)

...

यह Arnold प्रिंट करता है!

आप में से कुछ पहले से ही जानते हैं कि क्यों, लेकिन अगर आप नहीं जानते थे, तो यह सामान्य है, आपको थोड़ी देर में "अहा मोमेंट" का अनुभव होगा। निम्न पैराग्राफ को ध्यान से पढ़ें।

उपरोक्त कोड काम करता है क्योंकि हम स्ट्रिंग वैल्यू को म्यूटेट नहीं कर रहे हैं, हम इसे छू भी नहीं रहे हैं। इसके बजाय, हम person वेरिएबल को 'Arnold' नामक एक नई स्ट्रिंग वैल्यू असाइन कर रहे हैं ताकि यह अब 'Ernold' स्ट्रिंग वैल्यू को रेफरेंस (पॉइंट) न करे।

प्रिमिटिव वैल्यूज़ नहीं बदल सकतीं, लेकिन वेरिएबल्स बदल सकते हैं!

वेरिएबल्स वैल्यूज़ नहीं हैं, इसलिए म्यूटेबिलिटी या इम्यूटेबिलिटी के नियम समान नहीं हैं। वेरिएबल्स केवल वैल्यूज़ की ओर इशारा करते हैं।

हमने पूर्व स्ट्रिंग वैल्यू 'Ernold' को कभी सीधे नहीं छुआ, हमने बस अपने person वेरिएबल को 'Arnold' नामक दूसरी स्ट्रिंग की ओर इशारा करने के लिए कहा और फिर परिणाम प्रिंट करने के लिए console.log() का उपयोग किया।

आप में से कुछ सोच सकते हैं कि मैं मरे हुए घोड़े को पीट रहा हूँ, लेकिन यह अहसास होना महत्वपूर्ण है कि JavaScript कैसे काम करता है। दोहराव आपका दोस्त है।

नोट: इस पूरे ट्यूटोरियल में हमारे द्वारा उपयोग किए गए वेरिएबल्स का प्रकार कीवर्ड टाइप let है — जो म्यूटेबल है, जैसा कि आपने पिछले कोड उदाहरण में देखा। यदि हम const वेरिएबल का उपयोग कर रहे होते, तो स्थिति अलग होती — लेकिन मैं उस विषय को एक अलग ट्यूटोरियल के लिए छोड़ दूंगा।

सारांश में:

JavaScript में:

  • नॉन-प्रिमिटिव वैल्यूज़ को रेफर किया जा सकता है, एक्सेस किया जा सकता है — और म्यूटेट किया जा सकता है।
  • प्रिमिटिव वैल्यूज़ को रेफर किया जा सकता है, एक्सेस किया जा सकता है — लेकिन म्यूटेट नहीं किया जा सकता।
  • वेरिएबल्स और वैल्यूज़ दो अलग-अलग चीजें हैं, उन पर अलग-अलग नियम लागू होते हैं।
  1. जावास्क्रिप्ट में प्रॉमिसेस क्या हैं? जावास्क्रिप्ट में प्रॉमिसेस क्या हैं?

    प्रॉमिसेस हमें एसिंक्रोनस ऑपरेशन करने की अनुमति देती हैं जहां मान प्रॉमिस बनाते समय पहले से ज्ञात नहीं होता। एक प्रॉमिस की तीन स्टेट्स हो सकती हैं: पेंडिंग, फुलफिल्ड और रिजेक्टेड। जावास्क्रिप्ट में प्रॉमिसेस के लिए कोड निम्नलिखित है: उदाहरण <!DOCTYPE html> <html lang=en> <head> &l

  1. जावास्क्रिप्ट में फंक्शन एक्सप्रेशन्स क्या हैं? जावास्क्रिप्ट में फंक्शन एक्सप्रेशन्स क्या हैं?

    फंक्शन एक्सप्रेशन्स हमें फंक्शन को एक वेरिएबल में स्टोर करने की अनुमति देते हैं जिसे बाद में वेरिएबल नाम का उपयोग करके इनवोक किया जा सकता है। वे सामान्य फंक्शन डिक्लेरेशन की तरह होइस्ट नहीं होते इसलिए उन्हें परिभाषित होने से पहले नहीं बुलाया जा सकता। जावास्क्रिप्ट में फंक्शन एक्सप्रेशन्स को लागू कर

  1. JavaScript में क्लोजर्स (Closures) क्या हैं? JavaScript में क्लोजर्स (Closures) क्या हैं?

    JavaScript में क्लोजर्स हमें बाहरी फंक्शन के स्कोप को आंतरिक फंक्शन से एक्सेस करने की अनुमति देते हैं, यहां तक कि बाहरी फंक्शन के एक्जीक्यूट होकर रिटर्न होने के बाद भी। इसका मतलब है कि आंतरिक फंक्शन को हमेशा बाहरी फंक्शन के वेरिएबल्स की एक्सेस रहेगी।JavaScript में क्लोजर्स का कोड:उदाहरण<!DOCTYPE