परिवर्तनशीलता किसी मूल्य को बदलने की क्षमता है। एक परिवर्तनशील मान को बदला जा सकता है, और एक अपरिवर्तनीय मान को नहीं बदला जा सकता। एक आम ग़लतफ़हमी यह है कि "const" कीवर्ड एक वेरिएबल को अपरिवर्तनीय बनाता है।
वास्तव में, "const" केवल पुनर्असाइनमेंट को रोकता है। गैर-ऑब्जेक्ट प्रकारों के लिए, मानों को केवल पुन: असाइनमेंट के माध्यम से बदला जा सकता है, इसलिए उन्हें "const" के साथ घोषित करना वास्तव में उन्हें अपरिवर्तनीय बनाता है। उदाहरण के लिए, निम्नलिखित कोड पर विचार करें:
const num = 5; num = 7; // illegal reassignment of const variable
इस कोड में संख्या का मान बदलने का कोई तरीका नहीं है। ध्यान दें कि या -- का उपयोग करना अभी भी पुन:असाइनमेंट माना जाता है, और यदि हम उन्हें स्थिरांक के साथ घोषित चर पर उपयोग करने का प्रयास करते हैं तो यह त्रुटि संदेश में दर्शाया गया है।
const num = 5; num ;//illegal reassignment of constant
परिणामस्वरूप त्रुटि यह है:
Uncaught TypeError: Assignment to constant variable.
परिवर्तनशीलता के संबंध में वस्तुएं मौलिक रूप से भिन्न होती हैं, क्योंकि उनके मान चर के पुन: निर्धारण के बिना बदल सकते हैं। ध्यान दें कि संपत्तियों के पुनर्निर्धारण को "const" द्वारा रोका नहीं जाता है। केवल वेरिएबल नाम को पुन: असाइनमेंट से रोका गया है।
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
ऑब्जेक्ट्स में ऐसे तरीके भी हो सकते हैं जो आंतरिक मूल्यों को बदलते हैं।
const obj = { num: 5, increment(){ this.num ; } } obj.increment(); console.log(obj.num); //6
किसी वस्तु को "const" के साथ घोषित करके और object.freeze() का उपयोग करके उसे वास्तव में अपरिवर्तनीय बनाना संभव है।
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
ध्यान दें कि यदि हम सख्त मोड का उपयोग करते हैं, तो संख्या मान को बदलने का प्रयास वास्तव में निम्न त्रुटि संदेश के साथ क्रैश का कारण बनेगा:
Cannot assign to read only property 'num'
इस ऑब्जेक्ट को अपरिवर्तनीय बनाने के लिए "const" के बिना object.freeze() का उपयोग पहले से ही पर्याप्त है। हालाँकि, यह वेरिएबल नाम को अपरिवर्तनीय नहीं बनाता है।
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
कोड के इस संस्करण में क्या होता है कि ओबीजे को पुन: असाइन किया जाता है। फ़्रीज़() को पिछले ऑब्जेक्ट पर लागू किया गया था जिसका नाम समान था, लेकिन नया ऑब्जेक्ट कभी फ़्रीज़ नहीं हुआ था, इसलिए यह परिवर्तनशील है।
ऐसे समय होते हैं जब आप किसी ऑब्जेक्ट में मानों को बदलने की अनुमति देना चाहते हैं, लेकिन आप गुणों को जोड़ने या हटाने की अनुमति नहीं देना चाहते हैं। इसे object.seal() का उपयोग करके प्राप्त किया जा सकता है।
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
पूरी वस्तु पर फ्रीजिंग और सीलिंग लागू होती है। यदि आप विशिष्ट गुणों को अपरिवर्तनीय बनाना चाहते हैं, तो इसे definProperty() या definProperties() का उपयोग करके किया जा सकता है। इन दोनों के बीच चुनाव इस बात पर निर्भर करता है कि आप एक संपत्ति को प्रभावित करना चाहते हैं या एकाधिक संपत्तियों को।
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
इस उदाहरण में एक नई संपत्ति को परिभाषित किया जा रहा है, लेकिन definProperty() का उपयोग मौजूदा संपत्ति पर भी किया जा सकता है। ध्यान दें कि यदि "कॉन्फ़िगर करने योग्य" को पहले गलत पर सेट किया गया था, तो इसे सत्य में नहीं बदला जा सकता है, लेकिन यदि यह मूल रूप से सत्य था, तो इसे गलत पर सेट किया जा सकता है, क्योंकि यह परिवर्तन कॉन्फ़िगरेशन के एक प्रकार के रूप में गिना जाता है।
ज्यादातर मामलों में, आपको यह गारंटी देने की आवश्यकता नहीं होगी कि कोई वस्तु अपरिवर्तनीय है। जब ऐसी कोई आवश्यकता उत्पन्न होती है, तो यह आम तौर पर वस्तु को फ्रीज करने के लिए पर्याप्त होता है, लेकिन ऐसी आवश्यकताएं उत्पन्न होने पर हमारे पास बेहतर नियंत्रण के लिए अतिरिक्त विकल्प होते हैं।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3