8.8 Symbols (সিম্বল) 

 

Symbol (সিম্বল) জাভাস্ক্রিপ্টে একটি নতুন প্রিমিটিভ ( primitive ) টাইপ ভ্যারিয়েবল। অবজেক্ট প্রোপারটিস হিসাবে আমরা সবসময় স্ট্রিং ব্যবহার করলেও সিম্বল অবজেক্ট প্রোপারটিস হিসেবে আমাদের কিছু অতিরিক্ত সুবিধা দিচ্ছে। আজকে আমরা তা জানার চেষ্টা করবো।

সিম্বল সম্পর্কে জানার পূর্বে আমাদের জাভাস্ক্রিপ্টের ডাটাটাইপ সম্পর্কে জানতে হবে। জাভাস্ক্রিপ্টে দুই ধরণের ডাটাটাইপ আছে  প্রিমিটিভ( primitive ) এবং নন-প্রিমিটিভ(non-primitive)। 

প্রিমিটিভ ডাটাটাইপ হলো সিম্পল ভ্যালু টাইপ যেমনঃ string, integer, float, boolean, undefined, null । প্রিমিটিভ ডাটাটাইপ immutable অথবা অপরিবর্তনযোগ্য। প্রিমিটিভ ডাটাটাইপে ভ্যালু রিএসাইন  করা যায় কিন্তু পরিবর্তন করা যায় না।

let x = 1;
x++;

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

const first = "abc" + "def";
const second = "ab" + "cd" + "ef";
console.log(first === second);         // true

কিন্তু নন-প্রিমিটিভ এর ক্ষেত্রে তা ভিন্ন।

const obj1 = { name: "Intrinsic" };
const obj2 = { name: "Intrinsic" };

console.log(obj1 === obj2);          // false

 

এখন যেহেতু আমরা প্রিমিটিভ এবং নন-প্রিমিটিভ সম্পর্কে বেসিক ধারণা পেয়েছি আমরা সিম্বল কি তা জানার চেষ্টা করি। সিম্বল একটি প্রিমিটিভ ভ্যালু যা একটি অবজেক্টের মতো ব্যবহার করে । প্রতিবার সিম্বলের একটি নতুন ইনস্ট্যান্স তৈরী করলে তার প্রতিটি এক একটি ইউনিক সিম্বল। আবার সিম্বল immutable বা অপরিবর্তনযোগ্য । নিচের উদাহরন তা দেখলে জিনিষটা একটু পরিষ্কার হবে 

const s1 = Symbol();
const s2 = Symbol();

console.log(s1 === s2);       // false

প্রতিটি সিম্বল ইউনিক। আমরা অপশনাল আর্গুমেন্ট দিয়েও সিম্বল তৈরী করতে পারি।

const x = Symbol('hey');
console.log(x); // Symbol(hey)

আমরা অবজেক্টের ‘কি’ হিসেবে সিম্বল ব্যবহার করতে পারি।  

let id = Symbol("id");
let person = {
    name: "Jack",
    // adding symbol as a key
    [id]: 123               // not "id": 123

};

console.log(person);       // {name: "Jack", Symbol(id): 123}

সিম্বল প্রপার্টির কলিসন এড়ানোর জন্য অনেক উপকারী। ধরি আমাদের একটা অবজেক্ট আছে Person। দুইটি  প্রোগ্রাম Person অব্জেক্টটি  মডিফাই  করতে চায়  এবং Id নামের একটি প্রপার্টি এড করতে চায় । এখন দুইটি  প্রোগ্রাম একই নামের প্রপার্টি এড  করতে গেলে প্রপার্টি এর ভ্যালু ওভাররাইড বা পরিবর্তন করে ফেলবে । এই সমস্যা আমরা সিম্বল ব্যবহার করে সমাধান করতে পারি। সিম্বল ব্যবহার করে আমরা একটা ইউনিক প্রপার্টি তৈরী করে ব্যবহার করতে পারি।

let person = {
    name: "Jack"
};

// creating Symbol
let id = Symbol("id");

// adding symbol as a key
person[id] = 12;
console.log(person[id])      // 12

অন্যকোনো প্রোগ্রাম এখন id নামের সিম্বল ব্যবহার করলেও দুই প্রোগ্রামই তাদের নিজেদের তৈরী সিম্বল ডাটা খুঁজে পাবে। 

যদি string প্রপার্টি কী হিসাবে ব্যবহার করা হতো তাহলে ভ্যালু ওভাররাইট হয়ে যেত।

let person = {
    name: "Jack"
};

// using string as key 
// Program-1
person.id = 12;
console.log(person.id);        // 12




// Another program overwrites value
// Program-2
person.id = 'Another value';
console.log(person.id);        // Another value

 

এখানে প্রোগ্রাম-১ id এর ভ্যালু 12 এসাইন করলেও প্রোগ্রাম-২ ভ্যালু চেঞ্জ করে ফেলেছে। প্রোগ্রাম-১ এখন আর id এর প্রত্যাশিত ভ্যালু পাবে না।