জাভাস্ক্রিপ্ট একটি পাস-বাই-ভ্যালু ল্যাঙ্গুয়েজ। কিন্তু অবজেক্টের জন্য, ভ্যালুটিই হলো তাদের রেফারেন্স। তাই:
- প্রিমিটিভ ভ্যালু (int, string, boolean) পাস করলে কপি পাস হয়। ফাংশনের ভিতরে পরিবর্তন করলে কলারের কনটেক্সটে পরিবর্তন হয় না।
- অবজেক্ট পাস করলে রেফারেন্সের কপি পাস হয়। ফাংশনের ভিতরে অবজেক্টের ইন্টারন্যাল মিউটেট করলে オリজিনাল অবজেক্ট পরিবর্তিত হয়, কিন্তু রেফারেন্স রি-অ্যাসাইন করলে オリজিনাল প্রভাবিত হয় না।
উদাহরণ-১: প্রিমিটিভ (পাস-বাই-ভ্যালু)
let i = 0;
function increment(x) {
x = x + 1;
console.log(x); // 1
}
increment(i);
console.log(i); // 0 (অপরিবর্তিত)
উদাহরণ-২: অবজেক্ট (রেফারেন্সের কপি)
let obj = {'foo': 'bar'};
function updateRef(x) {
// x-এর লোকাল রেফারেন্স আপডেট হয়, obj প্রভাবিত হয় না
x = {};
}
function addHelloWorld(y) {
// y obj-র রেফারেন্স ধরে, ইন্টারন্যাল মিউটেট করলো
y['hello'] = 'world';
}
console.log(obj); // { foo: 'bar' }
updateRef(obj);
console.log(obj); // { foo: 'bar' } (অপরিবর্তিত)
addHelloWorld(obj);
console.log(obj); // { foo: 'bar', hello: 'world' } (মিউটেট হয়েছে)
আউটপুট
{ foo: 'bar' } { foo: 'bar' } { foo: 'bar', hello: 'world' }
ব্যাখ্যা
প্রথম ফাংশনে x = {} দিয়ে লোকাল ভেরিয়েবলকে নতুন অবজেক্টে রি-অ্যাসাইন করা হয়েছে, যা অরিজিনাল obj-কে প্রভাবিত করে না। দ্বিতীয় ফাংশনে y['hello'] = 'world' দিয়ে অরিজিনাল অবজেক্টের ইন্টারন্যাল স্টেট মিউটেট করা হয়েছে, যা আসল অবজেক্টে রিফ্লেক্ট হয়েছে।
নिष्कর্ষ
জাভাস্ক্রিপ্ট সবসময় পাস-বাই-ভ্যালু। প্রিমিটিভের জন্য ভ্যালু কপি হয়, অবজেক্টের জন্য রেফারেন্স কপি হয়। এটি কখনো পাস-বাই-রেফারেন্স নয়।