কম্পিউটার টিউটোরিয়াল

জাভাস্ক্রিপ্ট: পাস-বাই-রেফারেন্স নাকি পাস-বাই-ভ্যালু?

জাভাস্ক্রিপ্ট একটি পাস-বাই-ভ্যালু ল্যাঙ্গুয়েজ। কিন্তু অবজেক্টের জন্য, ভ্যালুটিই হলো তাদের রেফারেন্স। তাই:

  • প্রিমিটিভ ভ্যালু (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' দিয়ে অরিজিনাল অবজেক্টের ইন্টারন্যাল স্টেট মিউটেট করা হয়েছে, যা আসল অবজেক্টে রিফ্লেক্ট হয়েছে।

নिष्कর্ষ

জাভাস্ক্রিপ্ট সবসময় পাস-বাই-ভ্যালু। প্রিমিটিভের জন্য ভ্যালু কপি হয়, অবজেক্টের জন্য রেফারেন্স কপি হয়। এটি কখনো পাস-বাই-রেফারেন্স নয়।

  1. জাভাস্ক্রিপ্টে Map অবজেক্ট

  2. জাভাস্ক্রিপ্টে Blob অবজেক্ট

  3. জাভাস্ক্রিপ্টে RegExp অবজেক্ট

  4. জাভাস্ক্রিপ্টে অবজেক্ট ইলিশিয়ালাইজার