Vivasoft-logo

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 এর প্রত্যাশিত ভ্যালু পাবে না।

  • আমরা যতবার Symbol তৈরী করি, প্রত্যেকবার Symbol একটি নতুন করে তৈরী করে। যার কারণে দুইটার ভ্যালু একই থাকলেও তারা একই হয়না।

Symbol(‘foo’) === Symbol(‘foo’) // false
  • new কিওয়ার্ড দিয়ে Symbol তৈরী করা যায়না।

let sym = new Symbol() // TypeError
  • যদি আমরা Symbol wrapper অবজেক্ট তৈরী করতে চাই, তাহলে Object() ফাংশন ব্যবহার করতে হবে।

let sym = Symbol(‘foo’)
typeof sym // “symbol”
let symObj = Object(sym)
typeof symObj // “object”
  • Symbol-keyed প্রোপার্টিগুলো একেবারেই ইগনোর করা হবে যখন JSON.stringify() ব্যবহার করা হয়।

JSON.stringify({[Symbol(‘foo’)]: ‘foo’})
// ‘{}’
  • Symbol wrapper অবজেক্টগুলোকে প্রপার্টি হিসেবেও ব্যবহার করা যায়।

let sym = Symbol(‘foo’)
let obj = {[sym]: 1}
obj[sym] // 1
obj[Object(sym)] // still 1
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?

Symbol(‘dog’) === Symbol(‘dog’)
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
const car = Symbol(Ford);
console.log(car);
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
let animal = {
name: “Cow”
};
let age = Symbol(“age”);
animal[age] = 12;
console.log(animal[id])
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
JSON.stringify({[Symbol(‘name’)]: ‘name’})
  • নিচের কোড স্নিপেটের আউটপুট কি হবে?
let id = Symbol(“id”);
let car = {
name: “Tesla”,
[id]: 123
};
console.log(car);