यह समझना महत्वपूर्ण है कि =जावास्क्रिप्ट में ऑपरेटर क्या करता है और क्या नहीं करता है।
=ऑपरेटर एक नहीं है प्रतिलिपि डेटा की।
=ऑपरेटर एक नया बनाता है संदर्भ के लिए एक ही डेटा।
अपना मूल कोड चलाने के बाद:
var a = $('#some_hidden_var').val(),
b = a;
aऔर bअब एक ही वस्तु के दो अलग-अलग नाम हैं ।
इस ऑब्जेक्ट की सामग्री में आपके द्वारा किए गए किसी भी परिवर्तन को पहचान के रूप में देखा जाएगा चाहे आप इसे aचर या चर के माध्यम से देखें b। वे एक ही वस्तु हैं।
इसलिए, जब आप बाद में इस कोड के साथ bमूल aऑब्जेक्ट को "वापस" करने का प्रयास करते हैं :
b = a;
कोड वास्तव में कुछ भी नहीं करता है , क्योंकि aऔर bएक ही बात है। कोड वैसा ही है जैसा आपने लिखा है:
b = b;
जो स्पष्ट रूप से कुछ नहीं करेगा।
आपका नया कोड क्यों काम करता है?
b = { key1: a.key1, key2: a.key2 };
यहां आप {...}ऑब्जेक्ट शाब्दिक के साथ एक बिल्कुल नया ऑब्जेक्ट बना रहे हैं । यह नई वस्तु आपकी पुरानी वस्तु के समान नहीं है। तो अब आप bइस नई वस्तु के संदर्भ के रूप में सेट कर रहे हैं , जो आपको चाहिए।
किसी भी मनमानी ऑब्जेक्ट को संभालने के लिए, आप ऑब्जेक्ट क्लोनिंग फ़ंक्शन का उपयोग कर सकते हैं जैसे कि आर्मंड के उत्तर में सूचीबद्ध है, या जब से आप jQuery का उपयोग कर रहे हैं, तो $.extend()फ़ंक्शन का उपयोग करें । यह फ़ंक्शन या तो उथली प्रति या किसी वस्तु की गहरी प्रतिलिपि बना देगा। (इस $().clone()विधि के साथ भ्रमित न करें जो DOM तत्वों को कॉपी करने के लिए है, वस्तुओं के लिए नहीं।)
उथली प्रति के लिए:
b = $.extend( {}, a );
या एक गहरी प्रति:
b = $.extend( true, {}, a );
उथली प्रतिलिपि और गहरी प्रतिलिपि के बीच क्या अंतर है? एक उथली प्रति आपके कोड के समान है जो ऑब्जेक्ट शाब्दिक के साथ एक नई वस्तु बनाता है। यह एक नया शीर्ष-स्तरीय ऑब्जेक्ट बनाता है जिसमें मूल ऑब्जेक्ट के समान गुणों का संदर्भ होता है।
यदि आपकी वस्तु में केवल आदिम प्रकार हैं जैसे संख्या और तार, एक गहरी प्रतिलिपि और उथली प्रतिलिपि बिल्कुल वही काम करेगी। लेकिन अगर आपकी वस्तु में अन्य वस्तुएं या सरणियाँ निहित हैं, तो एक उथली प्रतिलिपि उन निहित वस्तुओं की प्रतिलिपि नहीं बनाती है , यह केवल उनके संदर्भ बनाता है। तो आपको नेस्टेड ऑब्जेक्ट्स के साथ वही समस्या हो सकती है जो आपके टॉप-लेवल ऑब्जेक्ट के साथ थी। उदाहरण के लिए, यह वस्तु दी गई है:
var obj = {
w: 123,
x: {
y: 456,
z: 789
}
};
यदि आप उस वस्तु की उथली प्रतिलिपि करते xहैं , तो आपकी नई वस्तु की संपत्ति xमूल से समान वस्तु है:
var copy = $.extend( {}, obj );
copy.w = 321;
copy.x.y = 654;
अब आपकी वस्तुएँ इस तरह दिखेंगी:
// copy looks as expected
var copy = {
w: 321,
x: {
y: 654,
z: 789
}
};
// But changing copy.x.y also changed obj.x.y!
var obj = {
w: 123, // changing copy.w didn't affect obj.w
x: {
y: 654, // changing copy.x.y also changed obj.x.y
z: 789
}
};
आप इसे एक गहरी नकल से बचा सकते हैं। गहरी प्रतिलिपि प्रत्येक नेस्टेड ऑब्जेक्ट और सरणी (और आर्मंड के कोड में दिनांक) को उन वस्तुओं की प्रतियों को बनाने के लिए उसी तरह से पुन: बनाता है जिस तरह से यह शीर्ष-स्तरीय ऑब्जेक्ट की प्रतिलिपि बनाता है। इसलिए बदलाव copy.x.yका कोई असर नहीं पड़ेगा obj.x.y।
संक्षिप्त उत्तर: यदि संदेह है, तो आप शायद एक गहरी प्रतिलिपि चाहते हैं।
aनिर्धारित किया गया था.val()- क्या यह सही है? क्या आपJSON.parse(a)वास्तविक वस्तु प्राप्त करने के लिए किसी बिंदु पर उपयोग करते हैं ?