=জাভাস্ক্রিপ্টে অপারেটর কী করবে এবং কী করবে না তা বোঝা গুরুত্বপূর্ণ ।
=অপারেটর একটি দেখা যায় না কপি ডেটার।
=অপারেটর একটি নতুন সৃষ্টি রেফারেন্স থেকে একই তথ্য।
আপনি আপনার মূল কোডটি চালানোর পরে:
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()পদ্ধতির সাথে বিভ্রান্ত করবেন না যা কোনও ডিওএম উপাদানগুলি অনুলিপি করার জন্য, বস্তুর জন্য নয়))
অগভীর কপির জন্য:
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;
এখন আপনার অবজেক্টগুলি এর মতো দেখতে পাবেন:
var copy = {
w: 321,
x: {
y: 654,
z: 789
}
};
var obj = {
w: 123,
x: {
y: 654,
z: 789
}
};
আপনি এটিকে একটি অনুলিপি সহ এড়াতে পারবেন। গভীর অনুলিপি প্রতিটি নেস্টেড অবজেক্ট এবং অ্যারেতে (এবং তারিখটি আর্ম্যান্ডের কোডে) পুনরাবৃত্তি করে সেইভাবে এই জিনিসগুলির অনুলিপি তৈরি করতে শীর্ষ স্তরের বস্তুর অনুলিপি তৈরি করে। সুতরাং পরিবর্তন copy.x.yপ্রভাবিত করবে না obj.x.y।
সংক্ষিপ্ত উত্তর: যদি সন্দেহ হয় তবে আপনি সম্ভবত একটি গভীর অনুলিপি চান।
aথেকে.val()আমি সেট করে ধরে নিয়েছি এটি JSON (একটি স্ট্রিং), কোনও বস্তু নয় - এটি কি ঠিক? আপনি কিJSON.parse(a)কোনও মুহুর্তে আসল অবজেক্টটি পেতে ব্যবহার করেন?