জাভাস্ক্রিপ্টে, আপনি প্রায়শই শুনবেন যে প্রিমিটিভ ভ্যালুগুলো immutable (পরিবর্তন-অনভেজ্য), অন্যদিকে নন-প্রিমিটিভ ভ্যালুগুলো mutable (পরিবর্তন-সক্ষম)। এই দুটি ভ্যালু টাইপের (ও ডেটা টাইপসও বলা হয়) পার্থক্য বুঝা জরুরি কারণ এটি ভবিষ্যতে আপনাকে অনেক ঝামেলা থেকে বাঁচাবে।
প্রিমিটিভ ভ্যালুগুলো হল:
- নাম্বার
- স্ট্রিং
- বুলিয়ান
নন-প্রিমিটিভ ভ্যালুগুলো হল:
- অবজেক্ট
- ফাংশন
Mutable মানে এটি পরিবর্তন করা যায়।
Immutable মানে এটি পরিবর্তন করা যায় না।
নন-প্রিমিটিভ ভ্যালুগুলো mutable
নিচে একটি লিস্ট (অ্যারে) দেওয়া আছে মানুষের, যা একটি ভেরিয়েবলে এসাইন করা আছে:
let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph'] এখন আমি আমার লিস্টটি মিউটেট করতে চাই। মিউটেট বলতে শুধু পরিবর্তন বোঝায়। আমি আرنল্ডকে জান-ক্লড দিয়ে রিপ্লেস করতে চাই এবং ফলাফল প্রিন্ট করতে চাই:
let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph'] peopleList[0] = 'Jean-Claude' console.log(peopleList) কাজ করল! আমরা এখন একটি বিদ্যমান ভ্যালুতে মিউটেশন করেছি। এই ক্ষেত্রে, বিদ্যমান ভ্যালুটি ছিল একটি অ্যারে (লিস্ট), বা আরও স্পেসিফিকভাবে, একটি অ্যারে অবজেক্ট।
জাভাস্ক্রিপ্টে, নন-প্রিমিটিভ ভ্যালুগুলো mutable (পরিবর্তনযোগ্য)।
প্রিমিটিভ ভ্যালুগুলো immutable
নিচে একটি টেক্সট (স্ট্রিং) ভ্যালু দেওয়া আছে যা একটি ভেরিয়েবলে এসাইন করা আছে:
let person = 'Ernold' দুর্ভাগ্যবশত, আমরা আرنল্ডর নাম ভুল লিখেছি, প্রথম অক্ষরে A-র জায়গায় E ব্যবহার করেছি। দ্রুত এটা ঠিক করে ফলাফল প্রিন্ট করি:
let person = 'Ernold' person[0] = 'A' console.log(person) // output: Ernold অবাক! কেন এটি "Ernold" প্রিন্ট করলো? কি আমরা E-কে A দিয়ে রিপ্লেস করলাম না!?
না, কারণ আমরা যে ভ্যালুটিকে মিউটেট করার চেষ্টা করছি তা একটি স্ট্রিং, যা একটি প্রিমিটিভ ভ্যালু — এবং সকল প্রিমিটিভ ভ্যালু immutable (অপরিবর্তনশীল)।
শুধু নন-প্রিমিটিভ ভ্যালুগুলো (অবজেক্ট ও ফাংশন) mutable।
বিভ্রান্ত?
জাভাস্ক্রিপ্ট শেখা শুরু করার প্রায়শই এই বিষয়ে বিভ্রান্ত হয়া স্বাভাবিক কারণ উপরের উদাহরণ দুটো সারফেসে দেখতে এবং কিছু পরিস্থিতিতে একইভাবে বিহেভ করে।
আসুন আগের আমাদের অ্যারে-র থেকে প্রথম নামটি প্রিন্ট করি:
let peopleList = ['Arnold', 'Linda', 'Sylvester', 'Dolph'] console.log(peopleList[0]) // output: "Arnold" এখানে কোন সরপ্রাইজ নেই, এটি "Arnold" প্রিন্ট করে।
এখন আগের আমাদের স্ট্রিং-র (ভুল লিখা নামটি) প্রথম অক্ষরটি প্রিন্ট করি:
let person = 'Ernold' console.log(person[0]) // output: ?? আপনি কী হব তা মনে করছেন?
...
...
এটি কাজ করল! এটি "E" প্রিন্ট করল!
আপনি কি উপরের কোড কাজ করবেনা বলে আশা করছিলেন?
যেমন হোক, এখানে গুরুত্বপূর্ণ লেসন হলো আপনি একটি প্রিমিটিভ ভ্যালুটিকে নন-প্রিমিটিভ ভ্যালুর মত এক্সেস করতে পারেন, কিন্তু আপনি এটি পরিবর্তন (মিউটেট) করতে পারবেন না। এটিই বড় পার্থক্য (এক্সেস বনাম মিউটেট)।
জাভাস্ক্রিপ্টে, প্রিমিটিভ ভ্যালুগুলো রিড-অনলি, য новой নন-প্রিমিটিভ ভ্যালুগুলো (অবজেক্ট/অ্যারে, ফাংশন) রিড অ্যান্ড রাইট উভয়।
সেই কারণেই আমরা আগে আমাদের অ্যারের প্রথম আইটেম ভ্যালু Arnold-কে Jean-Claude-তে পরিবর্তন করতে পেরেছিলাম, কিন্তু আমরা একটি সাধারণ স্পেলিং ভুল "Ernold"-কে "Arnold"-তে ঠিক করতে পারিনি — কারণ এটি একটি স্ট্রিং, এবং স্ট্রিং/প্রিমিটিভ ভ্যালু immutable।
ভেরিয়েবল বনাম ভ্যালু
(আমি জানি আপনাদের কয়েকজন কী চিন্তা করছেন)
যদিও আমরা এখনই উপসংহার করেছি যে প্রিমিটিভ ভ্যালুগুলো immutable, আমি এখনও "Ernold"-র স্পেলিং ভুল ঠিক করতে দৃঢ়প্রতিজ্ঞ। আসুন কিছু নতুন চেষ্টা করি!
নিচের কোডটি দেখুন (ধৈর্য ধরে পড়ুন):
let person = 'Ernold' person = 'Arnold' console.log(person) // output: ?? প্রিমিটিভ ভ্যালু, যেমন স্ট্রিং, সম্পর্কে আপনি যা শিখেছেন সেটি বিবেচনা করে, আপনি কি মনে করেন উপরের কোড Arnold প্রিন্ট করবে, হ্যাঁ নাকি না?
...
(একটু চিন্তা করুন)
...
এটি Arnold প্রিন্ট করল!
আপনাদের কয়েকজন ইতিমধ্যে কেন জানেন, কিন্তু আপনি না জানলে এটাও স্বাভাবিক, একটু দেরে আপনি "আহা মোমেন্ট" পাবেন। নিচের প্যারাগ্রাফটি ভালোভাবে পড়ুন।
উপরোক্ত কোডটি কাজ করে কারণ আমরা স্ট্রিং ভ্যালুটিকে মিউটেট করছি না, আমরা সেটি স্পর্শ করছি না। বরং, আমরা person ভেরিয়েবলে একটি নতুন স্ট্রিং ভ্যালু 'Arnold' এসাইন করছি যাতে সেটি আর 'Ernold' স্ট্রিং ভ্যালুটিকে রেফার (পয়েন্ট) করে না।
প্রিমিটিভ ভ্যালুগুলো পরিবর্তন করা যায় না, কিন্তু ভেরিয়েবলগুলো পরিবর্তন করা যায়!
ভেরিয়েবলগুলো ভ্যালু নয়, তাই মিউটেবিলিটি বা ইমিউটেবিলিটির নিয়মগুলো এক নয়। ভেরিয়েবলগুলো শুধু ভ্যালুগুলোর দিকে পয়েন্ট করে।
আমরা কখনো সাবেক স্ট্রিং ভ্যালু 'Ernold'-কে সরাসরি স্পর্শ করলাম না, আমরা শুধু আমাদের person ভেরিয়েবলকে বললাম অন্য একটি স্ট্রিং 'Arnold'-এর দিকে পয়েন্ট করতে এবং তারপর console.log() ব্যবহার করে ফলাফল প্রিন্ট করলাম।
আপনাদের কয়েকজন মনে করতে পারেন আমি মৃত ঘোড়ায় চাবুক দিচ্ছি, কিন্তু জাভাস্ক্রিপ্ট কীভাবে কাজ করে সেটি বুঝতে এই বোধ খুব গুরুত্বপূর্ণ। রিপিটিশন আপনার বন্ধু।
নোট: এই পুরো টিউটোরিয়ালে আমরা যে টাইপের ভেরিয়েবলগুলো ব্যবহার করেছি সেগুলোর কীওয়ার্ড টাইপ let — যা মিউটেবল, যেমন আপনি আগের কোড উদাহরণে দেখলেন। আমরা যদি const ভেরিয়েবল ব্যবহার করতাম, তবে পরিস্থিতি ভিন্ন হতো — কিন্তু সেটি অন্য কোনো টিউটোরিয়ালের জন্য রাখছি।
সংক্ষেপে:
জাভাস্ক্রিপ্টে:
- নন-প্রিমিটিভ ভ্যালুগুলোকে রেফার করা, এক্সেস করা — এবং মিউটেট করা যায়।
- প্রিমিটিভ ভ্যালুগুলোকে রেফার করা, এক্সেস করা — কিন্তু মিউটেট করা যায় না।
- ভেরিয়েবল এবং ভ্যালু দুটি ভিন্ন জিনিস, আলাদা নিয়ম কাজ করে।