Skip to main content

Command Palette

Search for a command to run...

Mutable Vs Immutable in JavaScript

Updated
5 min readView as Markdown

Mutable এবং Immutable কি? জাভাস্ক্রিপ্ট ডেভেলপাররা হরহামেশায় এই কথা টা শুনে থাকে যদি ও এইটা জাভাস্ক্রিপ্ট স্পেসিফিক কোন টার্ম না এইটা একটা প্রোগ্রামিং টার্ম। অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজে ও আপনি এইটা দেখবেন। ইন্টারভিউতে জাভাস্ক্রিপ্ট ডেভেলপারদের কে সবচেয়ে বেশি যেই টপিকের উপর প্রশ্ন করা এর মধ্যে Mutable এবং Immutable অন্যতম একটা টপিক। তাহলে চলেন এইবার বিস্তারিত জানার চেষ্টা করি।

প্রথমে জানার চেষ্টা করি Mutable এবং Immutable এর বাংলা অর্থ কি?

  • Mutable এর বাংলা অর্থ → পরিবর্তনীয় ।
  • Immutable এর বাংলা অর্থ → অপরিবর্তনীয়।

এইটুক পড়ে আমরা বুঝতে পারছি যে যেইটা পরিবর্তন করা যাবে সেইটা Mutable এবং যেইটা অপরিবর্তনীয় সেটাই Immutable

এখন কথা হচ্ছে কি পরিবর্তনীয় আর অপরিবর্তনীয়?

উত্তর: Value (মান )

আপনি যদি গুগল এ সার্চ করেন Mutable Vs Immutable এই রকম একটা ডেফিনেশন দেখবেন।

IF the value can change the object is called mutable while if the value cannot change, the object is called immutable.

জাভাস্ক্রিপ্ট এ মূলত ২ ধরণের ডাটা টাইপ আছে। Primitive এবং Reference টাইপ।

  • প্রিমিটিভ ডাটা টাইপ গুলো হলো : Strings, Numbers, Boolean, Null, undefined
  • রেফারেন্স ডাটা টাইপ গুলো হলো: Arrays, Objects, Function

এদের মাঝে মৌলিক পার্থক্যই হচ্ছে যে প্রিমিটিভ ডাটা immutable বা অপরিবর্তনীয় এবং নন-প্রিমিটিভ(রেফারেন্স) ডাটা mutable বা পরিবর্তনীয়।

অনেক তো থিওরি কথা বার্তা হলো এইবার একটু প্রাক্টিক্যালি বুঝার চেষ্টা করি।

// Primitive Type Data (Immutable)
let x = 10;
let y = x;
y = 30;
console.log(x) // Output: 10
console.log(y) // Output: 30


// Reference Type Data (Mutable)
let students = ["Rony", "Lincoln", "Faysal", "Sourov"];
let teachers = students;
teachers[3] = "Ziaul";

console.log(students); // Output: ["Rony", "Lincoln", "Faysal", "Ziaul"]
console.log(teachers); // Output: ["Rony", "Lincoln", "Faysal", "Ziaul"]

উপরের কোড টা যদি আমরা লক্ষ্য করি তাহলে দেখবো প্রথমে আমরা x নাম এ একটা ভ্যারিয়েবল ডিক্লেয়ার করেছি এবং তার মধ্যে ভ্যালু হিসেবে 10 স্টোর করেছি এবং তার পরের লাইনে y নামে একটা ভ্যারিয়েবল ডিক্লেয়ার করেছি এবং একই সাথে ভ্যালু হিসেবে সেট করেছি x আর ভ্যালু কে। তার পরের লাইন এ y এর ভ্যালু পরিবর্তন করে 30 করেছি।

এবার আমরা x এবং y ভ্যারিয়েবল দুইটাকে কনসোল লগ করলে দেখবো আউটপুট হিসেবে x এর ভ্যালু 10 এবং y এর ভ্যালু 30 প্রিন্ট হয়েছে। আমরা ভাবতেছি আর এ এমন ই তো হওয়ার কথা যেহেতু আমরা প্রথমে x ভ্যালু সেট করেছি 10 তাই x এর ভ্যালু আউটপুট এ 10 দেখাচ্ছে আর যদি ও পরের লাইনে y এর ভ্যালু হিসেবে x ভ্যালু হিসেবে সেট করেছি কিন্ত তার পরের লাইনে ই যেহেতু y এর ভ্যালু পরিবর্তন করে 30 করে দিয়েছি তাই y এর ভ্যালু 30 ই দেখানোর কথা এবং দেখিয়েছে ও তাই। তার মানে সব কিছু ঠিক ঠাক।

এবার যদি আমরা পরের উদহারণ টা দেখি তাহলে দেখবো প্রথমে students নাম একটা অ্যারে ডিক্লেয়ার করা হয়েছে এবং সেখানে কিছু students এর নাম রয়েছে এবং তার পরের লাইন এ teachers নাম এ একটা ভ্যারিয়েবল ডিক্লেয়ার করা হয়েছে এবং একই সাথে ভ্যালু হিসেবে সেট করা হয়েছে students অ্যারে কে। তার পরের লাইন এ আমরা teachers অ্যারে এর 3 নাম্বার ইনডেক্স এর ভ্যালু টা পরিবর্তন করেছি। আবার যদি আমরা আউটপুট দেখি। তাহলে দেখবো! students অ্যারে এবং teachers অ্যারে এর আউটপুট সেইম দেখাচ্ছে! এইখানে হচ্ছে বুঝার বিষয় এমন টা কেন হলো!

প্রথম প্রোগ্রাম টা তে সব কিছু ঠিক ঠাক ই ছিল পরের প্রোগ্রাম টা তে এমন হলো কেন! একদম সহজ করে যদি বলি আমরা যখন একটা প্রিমিটিভ টাইপ এর ভ্যারিয়েবল ডিক্লেয়ার করি তখন ঐ ভ্যারিয়েবল মেমরিতে তে একটা জায়গা দখল করে আবার যখন একটা ভ্যারিয়েবল ডিক্লেয়ার করি তখন ঐ ভ্যারিয়েবল মেমেমোরিতে আবার একটা নতুন একটা জায়গা দখল করে। এক কথায় আপনি যত বার ই প্রিমিটিভ টাইপ এর ভ্যারিয়েবল ডিক্লেয়ার করবেন ততবার ই ভ্যারিয়েবল মেমোরি তে নতুন জায়গা দখল করবে। তাই, আপনি যখন একটা প্রিমিটিভ টাইপ এর ভ্যারিয়েবল ডাটা পরিবর্তন করতেছেন তখন আপনি আসলে ওই মেমরি লোকেশন থাকা ভ্যারিয়েবল এর ভ্যালু পরিবর্তন করতেছেন। অন্য ভ্যারিয়েবল এর ভ্যালু ঠিক ই থাকতেছে কোনো পরিবর্তন হচ্ছে না। মানে ভ্যালু Immutable থাকতেছে।

আর পরের প্রোগ্রাম টা তে আমরা যখন একটা অ্যারে এর ভ্যালু হিসেবে অন্য একটা অ্যারে কে সেট করতেছি তখন আসলে পরের অ্যারে এর জন্য জাভাস্ক্রিপ্ট নতুন কোনো মেমরি দখল করতেছে না। জাস্ট পূর্বের অ্যারে এর একটা রেফারেন্স স্টোর করতেছে। তাই যেকোন একটা অ্যারে এর ভ্যালু পরিবর্তন করলে অন্য একটা অ্যারে এর ভ্যালু ও পরিবর্তন হয়ে যাচ্ছে মানে ভ্যালু Mutable হচ্ছে।

সেইম ভাবে আমরা যদি আরেকটা উদাহরণ দেখি:

// Primitive Type Data (Immutable)
let nameOne = "Kawsar";
let nameTwo = nameOne;
nameTwo = "Amzad"
console.log(nameOne) // Output: Kawsar
console.log(nameTwo) // Output: Amzad


// Reference Type Data (Mutable)
let personOne= {
  name: "Sajib",
  email: "sajib@mail.com"
}
let personTwo= personOne;
personTwo.name = "Yeasin";
personTwo.age = 23;

console.log(personOne); // Output: {name: 'Yeasin', email: 'sajib@mail.com', age: 23}
console.log(personTwo); // Output: {name: 'Yeasin', email: 'sajib@mail.com', age: 23}

আমাদের যদি কখন ও Mutable অবজেক্ট কে Immutable করতে চাই তাহলে নিচের কোড টুকু বুঝার চেষ্টা করি।

// Convert array mutable to immutable
let students = ["Rony", "Lincoln", "Faysal", "Sourov"];
let teachers = students.concat();
teachers[3] = "Ziaul";

console.log(students); // Output: ["Rony", "Lincoln", "Faysal", "Sourov"];
console.log(teachers); // // Output: ["Rony", "Lincoln", "Faysal", "Ziaul"];


// Convert Object mutable to immutable
let personOne = {
  name: "Sajib",
  email: "sajib@mail.com"
}
let personTwo = Object.assign({}, personOne);
personTwo.name = "Yeasin",
personTwo.email = "yeasin@mail.com"
personTwo.age = 23;

console.log(personOne); // Output: {name: 'Sajib', email: 'sajib@mail.com'}
console.log(personTwo); // Output: {name: 'Yeasin', email: 'yeasin@mail.com', age: 23}

ES6 এ স্প্রেড অপারেটর ব্যবহার করে এই কাজটি আমরা আর ও সহজে করতে পারি।

// Convert array mutable to immutable
let students = ["Rony", "Lincoln", "Faysal", "Sourov"];
let teachers = [...students]; // ... spread operator
teachers[3] = "Ziaul";

console.log(students); // Output: ["Rony", "Lincoln", "Faysal", "Sourov"];
console.log(teachers); // // Output: ["Rony", "Lincoln", "Faysal", "Ziaul"];


// Convert Object mutable to immutable
let personOne = {
  name: "Sajib",
  email: "sajib@mail.com"
}
let personTwo = {...personOne}; // ... spread operator
personTwo.name = "Yeasin",
personTwo.email = "yeasin@mail.com"
personTwo.age = 23;

console.log(personOne); // Output: {name: 'Sajib', email: 'sajib@mail.com'}
console.log(personTwo); // Output: {name: 'Yeasin', email: 'yeasin@mail.com', age: 23}
M

Very Helpful tutorial

1
A

Thank you.

S

Good one!

1
A

Thank you.

More from this blog

অধ্যায় ১: কম্পিউটার নেটওয়ার্ক ও ইন্টারনেট

আজকের ইন্টারনেট মানুষের তৈরি করা সবচেয়ে বড় একটা প্রযুক্তি সিস্টেম। যেখানে কোটি কোটি কম্পিউটার , যোগাযোগ মাধ্যম , এবং সুইচ রয়েছে একসাথে সংযুক্ত; এতে বিলিয়ন সংখ্যক ব্যবহারকারী রয়েছেন, যারা ল্যাপটপ, ট্যাবলেট ও স্মার্টফোনের মাধ্যমে ইন্টারনেটে সংযুক্...

Jul 28, 202514 min read10

ডাটা স্ট্রাকচার এবং এলগোরিদম কি ?

আজকের পর্বে আমরা ডাটা স্ট্রাকচার এবং এলগোরিদম কি এবং ডাটা স্ট্রাকচার এবং এলগোরিদম এর প্রয়োজনীয়তা কি? কেন আমাদের ডাটা স্ট্রাকচার এবং এলগোরিদম শিখা উচিত এই নিয়ে বিস্তারিত আলোচনা করবো ইনশাআল্লাহ। ডাটা স্ট্রাকচার কি ?In computer science, a data structure...

Mar 11, 20243 min read22

কেন কমান্ড লাইন শিখা উচিত?

কমান্ড লাইন শিখার পূর্বে আমরা জানার চেষ্টা করি কেন আমাদের কমান্ড লাইন শিখা উচিত? ওয়েব ডেভেলপার, ডাটা সায়েন্টিস্ট, ডেভঅপস ইঞ্জিনিয়ার, সিস্টেম অ্যাডমিন, সিকিউরিটি অ্যাডমিন, মেশিন লার্নিং ইঞ্জিনিয়ার যা ই আপনি হতে চান না কেন দৈনন্দিন কাজে আপনাকে কমান্ড ল...

Jun 7, 20233 min read47

টাইম কমপ্লেক্সিটি, স্পেস কমপ্লেক্সিটি, বিগ ও নোটেশন(পর্ব-০৩)

টাইম কমপ্লেক্সিটি, স্পেস কমপ্লেক্সিটি, বিগ ও নোটেশন(পর্ব ০২) এ আমরা কনস্ট্যান্ট টাইম এলগোরিদম Big O(1) নিয়ে কথা বলছিলাম। আজকে আমরা অন্যান্য টাইম কমপ্লেক্সিটিগুলো নিয়ে কথা বলবো ইনশাআল্লাহ। প্রথমে একটা একটা প্রোগ্রামিং সমস্যা নিয়ে কথা বলি। ধরেন একটা অ্...

Nov 10, 20225 min read93

জাভাস্ক্রিপ্ট স্টেটমেন্ট এবং এক্সপ্রেশন

প্রোগ্রামিং শেখার শুরুর দিকে স্টেটমেন্ট এবং এক্সপ্রেশন এই দুইটা কথা আমরা হরহামেশায় শুনে থাকি। কিন্তু হটাৎ করে যখন কেউ জিজ্ঞেস করে স্টেটমেন্ট কি আর এক্সপ্রেশন কি? এই দুইটার মধ্যে পার্থ্ক্য কি ? এই রকম প্রশ্ন শোনার পর আমরা একটু কনফিউশন এ থাকি অথবা ব্যা...

Oct 28, 20223 min read138

Untitled Publication

10 posts