सबसे पहले, सी में "एक स्ट्रिंग अंतिम elem = '\ 0' वाले वर्णों की एक सरणी है। वे उत्परिवर्तनीय हैं।
आप घोषित करने और इस तरह सी में एक स्ट्रिंग को प्रारंभ करते हैं:
char str[] = "Foo";
क्या आप मूल रूप से कर रहे हैं 4 बाइट आरक्षित है (शायद 8 बिट बाइट, यह शायद कोई आपत्ति नहीं है अगर यह आपको दर्द होता है)। शब्द str इस सरणी के पहले elem के लिए एक सूचक के रूप में कार्य करता है। इसलिए, यदि आप ऐसा करते हैं:
str[0] or *(str) = 'G'
तो यह नई सरणी बनाने के बजाय उस पते पर मान को बदल देगा। आप स्ट्र के पते को प्रिंट करके इसे सत्यापित कर सकते हैं। दोनों मामलों में यह वही होगा।
अब जावास्क्रिप्ट स्ट्रिंग के मामले में एक आदिम प्रकार है। स्ट्रिंग पर सभी ऑपरेशन संदर्भ के बजाय मूल्य द्वारा किया जाता है। तो, ऐसा करने से सच हो जाएगा।
var str1 = "foo";
var str2 = "foo";
str1 === str2; => true
स्ट्रिंग के प्रारंभ एक बफर के लिए पूछता है "foo" फिट करने के लिए और यह करने के नाम str1 बांधता है। उन्हें अपरिवर्तनीय बनाता है कि आप उस बफर को नहीं बदल सकते हैं। तो, आप यह कर सकते हैं नहीं:
str1[0] = 'G'
इस आदेश निष्पादित कोई चेतावनी या गैर कठोर मोड में त्रुटि उत्पन्न करेगा लेकिन, यह str1 नहीं बदलेगा। आप
console.log(str1) => "foo"
द्वारा यह सत्यापित कर सकते हैं लेकिन अगर आप इस तरह कार्य करें:
str1 = "goo"
क्या आप वास्तव में कर रहे हैं कि आप एक नया बफर के लिए पूछ रहे हैं "goo" फिट और करने के लिए पहचानकर्ता str1 बाध्य करने के लिए है यह। उस पुराने बफर में कोई बदलाव नहीं है जिसमें "foo" है।
तो, "foo" के साथ क्या होता है?
जावा स्क्रिप्ट में एक स्वचालित कचरा कलेक्टर है। जब यह स्मृति के कुछ हिस्से को देखता है जिसे किसी भी पहचानकर्ता द्वारा संदर्भित नहीं किया जा सकता है या ... तो यह उस स्मृति को मुक्त मानता है।
संख्या, बूलियन के समान होता है। अब, रैपर ऑब्जेक्ट्स के बारे में! जब भी आप इस तरह स्ट्रिंग पर एक संपत्ति तक पहुँचने का प्रयास:
str1.length;
क्या जावास्क्रिप्ट यह स्ट्रिंग वर्ग का उपयोग कर एक नई वस्तु बनाता है और स्ट्रिंग पर विधियां प्रारंभ करता है। जैसे ही फ़ंक्शन कॉल लौटाता है, ऑब्जेक्ट नष्ट हो जाता है। नीचे कोड इसे आगे बताते हैं:
var str = "nature";
str.does = "nurtures"; //defining a new property;
console.log(str.does) => undefined
क्योंकि वस्तु को नष्ट कर दिया गया है। इसे आजमाएं!
var str = new String("Nature");
str.does = "nurtures";
console.log(str) => ??
इस str वास्तव में एक वस्तु है ...
निष्कर्ष: सी में, एक ही दायरे में चर नाम सूचक के रूप में कार्य करता है। तो, int, float, स्ट्रिंग सभी mutable हैं।लेकिन जावा स्क्रिप्ट में एक आदिम प्रकार चर नाम मूल्य के रूप में कार्य करता है नहीं संदर्भ के रूप में
संदर्भ: सी ++ प्राइमर प्लस, जावा स्क्रिप्ट निश्चित गाइड, सी स्टीफन कोचन द्वारा
डुप्लिकेट: http://stackoverflow.com/questions/3200211/what- करता है-अपरिवर्तनीय-माध्य – timss
मैंने उस पोस्ट को देखा है। लेकिन मैं सिर्फ एक विधि नहीं बुलाता हूं। मैं एक नया मूल्य आवंटित करता हूं। क्या वही है? –
एक नया मान असाइन करना ठीक है: एक नया मान असाइन करता है। आपने एक स्ट्रिंग को संशोधित नहीं किया है, आपने एक संदर्भ बदल दिया है। हां, वैरिएबल संदर्भ ऑब्जेक्ट्स: उदाहरण के लिए "हाय वहाँ" .split() 'या' टाइप 5''। –