Q38. What are Symbols in JavaScript and when should you use them?
অদৃশ্য ও নিশ্চিতভাবে আলাদা key তৈরির উপায় — কোথায় এবং কেন ব্যবহার করবেন।
Symbol হলো একটি primitive data type যা একটি মানের identity তৈরি করে, কিন্তু মানটি সরাসরি দেখা যায় না। প্রতিটি Symbol() কল একেবারে আলাদা ও অদৃশ্য key বানায়, তাই কোড লিখে ভুলে যেতে পারেন না।
const id1 = Symbol("id");
const id2 = Symbol("id");
console.log(id1 === id2); // false — description একই হলেও আলাদা
console.log(typeof id1); // "symbol"
console.log(id1.toString()); // "Symbol(id)"
const user = { name: "Rahim" };
user[id1] = 101;
console.log(user[id1]); // 101
console.log(Object.keys(user)); // ["name"] — symbol দেখা যায় না
console.log(JSON.stringify(user)); // {"name":"Rahim"}ধাপে ধাপে — id1 ও id2-এর বর্ণনা দুটোই id, কিন্তু প্রতিটি Symbol() কল নতুন identity তৈরি করে, তাই দুটো কখনো সমান হয় না। আর Object.keys ও JSON.stringify শুধু string key দেখায়, তাই symbol key ওদের চোখে পড়ে না — এটাই Symbol-এর গোপন স্বভাব।
সবচেয়ে জনপ্রিয় ব্যবহার হলো object-এর method যেন কোনো কোড ইচ্ছাকৃতভাবে overwrite না করতে পারে।
const counter = {
count: 0,
increment() {
this.count++;
},
};
// ভুলে গিয়ে লেখা হলো
counter.increment = function () {
this.count = 0;
};
// Symbol ব্যবহার করলে বাইরের কেউ ভুলে সেটা বদলাতে পারবে না
const safe = {
count: 0,
[Symbol.for("private.increment")]: function () {
this.count++;
},
increment() {
this[Symbol.for("private.increment")]();
},
};আরেকটি জনপ্রিয় জায়গা library ও class-এর private state রাখা। Symbol key বাইরের কোড খুঁজে দেখতে পারে না, তবে Object.getOwnPropertySymbols() দিয়ে খুঁজে বের করা যায়।
const secret = Symbol("secret");
const vault = {
[secret]: "গোপন তথ্য",
};
vault.secret = "অন্য কিছু"; // নতুন string key, আগেরটা অক্ষত
console.log(vault[secret]); // "গোপন তথ্য"
console.log(Object.keys(vault)); // ["secret"]// জানা উপচীল method
const iterable = [1, 2, 3];
console.log(iterable[Symbol.iterator]); // ফাংশন
console.log(typeof iterable.toString()); // "function"
console.log(typeof iterable.valueOf()); // "function"
// for...of আসলে এই method-ই ডাকে
console.log([...iterable]); // [1, 2, 3]Symbol() আর Symbol.for()-এর পার্থক্য হলো — প্রথমটি সবসময় নতুন identity দেয়, আর দ্বিতীয়টি global registry থেকে একই নামের key ফেরত দেয়।
const local = Symbol("key");
console.log(local === Symbol("key")); // false
console.log(Symbol.for("key") === Symbol.for("key")); // trueএকটি সাধারণ রীতি — key বারবার না লিখতে module-এর শুরুতে একবার const NAME = Symbol("name") বানিয়ে রাখা, তারপর সেটা ব্যবহার করা।
| বিষয় | Symbol | String |
|---|---|---|
| দেখা যায় | Object.keys-এ না | হ্যাঁ |
JSON.stringify | থাকে না | থাকে |
| তুলনা | identity দিয়ে | value দিয়ে |
| পরিবর্তনযোগ্য | না | হ্যাঁ |
Symbol ব্যবহার করুন যখন (১) কোনো property বাইরের কোড থেকে সুরক্ষিত রাখতে চান, (২) নিজস্ব type tag বানাতে চান, বা (৩) library-তে আপনার নতুন API যোগ করতে চান যাতে পুরোনো কোড না ভাঙে। প্রয়োজন না থাকলে সাধারণ string key-ই যথেষ্ট।