Symbol কি এবং কিভাবে কাজ করে

Symbols - জাভাস্ক্রিপ্ট ইএস৬ (ES6) - Web Development

283

Symbol হল ES6 (ECMAScript 2015) এ যুক্ত একটি নতুন প্রিমিটিভ ডেটা টাইপ, যা একটি ইউনিক এবং অপরিবর্তনীয় মান প্রদান করে। Symbol এর মূল উদ্দেশ্য হলো বিভিন্ন প্রোপার্টি বা কনস্ট্যান্টের জন্য ইউনিক আইডেন্টিফায়ার তৈরি করা, যাতে আপনি গ্লোবাল স্কোপ বা অন্য অবজেক্টের প্রোপার্টি নামের সাথে সংঘর্ষ (name conflict) এড়াতে পারেন।


1. Symbol কী?

Symbol একটি নতুন ধরনের ডেটা টাইপ যা সবসময় ইউনিক মান তৈরি করে। এটি অন্যান্য ডেটা টাইপ (যেমন, স্ট্রিং, নাম্বার ইত্যাদি) এর থেকে আলাদা, কারণ Symbol এর মান কখনও পুনরাবৃত্তি হয় না এবং এটি অপরিবর্তনীয় (immutable)। একবার একটি Symbol তৈরি হলে, তা কোনোভাবেই পরিবর্তন করা যায় না।

উদাহরণ:

const sym1 = Symbol();
const sym2 = Symbol();

console.log(sym1 === sym2);  // false

এখানে, sym1 এবং sym2 দুটি ভিন্ন Symbol, যার মান কখনোই সমান হবে না, যদিও উভয়ই Symbol() এর মাধ্যমে তৈরি করা হয়েছে।


2. Symbol এর ব্যবহারের উদ্দেশ্য

Symbol প্রধানত দুটি উদ্দেশ্যে ব্যবহার করা হয়:

  1. গোপনীয় প্রোপার্টি তৈরি করতে: এটি ক্লাস বা অবজেক্টে গোপনীয় প্রোপার্টি তৈরি করতে ব্যবহার করা যেতে পারে, যা বাইরে থেকে সহজে এক্সেস করা সম্ভব নয়।
  2. Unambiguous identifiers (স্পষ্ট আইডেন্টিফায়ার): যখন আপনি গ্লোবাল অবজেক্ট বা অবজেক্টের মধ্যে একাধিক প্রোপার্টি ব্যবহার করছেন, তখন Symbol এর মাধ্যমে ইউনিক আইডেন্টিফায়ার তৈরি করা যেতে পারে, যাতে কোনো সংঘর্ষ (name conflict) না হয়।

3. Symbol এর গঠন এবং ব্যবহার

Symbol() Constructor

Symbol তৈরি করার জন্য Symbol() কনস্ট্রাকটর ব্যবহার করা হয়। একটি Symbol তৈরি করার সময় আপনি একটি optional description প্রদান করতে পারেন, যা শুধুমাত্র ডিবাগিং বা লোগিং এর জন্য কাজে আসে। এটি কর্মক্ষম নয়, অর্থাৎ এটি Symbol এর মানে কোনো প্রভাব ফেলে না।

উদাহরণ:

const sym1 = Symbol('description');
const sym2 = Symbol('description');

console.log(sym1 === sym2);  // false
console.log(sym1);  // Symbol(description)

এখানে 'description' শুধুমাত্র একটি নির্দিষ্ট ব্যাখ্যা (description) হিসেবে কাজ করেছে, কিন্তু Symbol এর মান বা বৈশিষ্ট্য একই থাকেনি।


4. Symbol এর ব্যবহার

গোপনীয় প্রোপার্টি হিসেবে ব্যবহার

Symbol এর সবচেয়ে সাধারণ ব্যবহার হলো গোপনীয় প্রোপার্টি তৈরি করা। এটি এমন প্রোপার্টি তৈরি করতে সাহায্য করে যা বাইরের কোড থেকে অ্যাক্সেস করা সহজ নয়, কারণ Symbol এর মান অন্য যে কোনো মানের সাথে মেলানো সম্ভব নয়।

উদাহরণ:

const secretKey = Symbol('secret');

// Create an object with a Symbol property
const user = {
  name: 'John',
  age: 30,
  [secretKey]: 'This is a secret value'
};

console.log(user.name);  // John
console.log(user[secretKey]);  // This is a secret value

এখানে secretKey একটি Symbol, যা শুধুমাত্র সেই অবজেক্টে থাকা কোড দ্বারা এক্সেসযোগ্য।

ইটারেবল অবজেক্টের জন্য Symbol.iterator

ES6 এ, Symbol.iterator একটি বিল্ট-ইন সিম্বল যা কোনো অবজেক্টের জন্য ইটারেটর (iterator) তৈরি করতে ব্যবহৃত হয়। যখন কোনো অবজেক্ট Symbol.iterator মেথড প্রদান করে, তখন এটি ইটারেবল হয়ে ওঠে এবং for...of লুপের মাধ্যমে উপাদানগুলি একে একে অ্যাক্সেস করা যেতে পারে।

উদাহরণ:

const myArray = [1, 2, 3];

const iterator = myArray[Symbol.iterator]();

console.log(iterator.next().value);  // 1
console.log(iterator.next().value);  // 2
console.log(iterator.next().value);  // 3

এখানে, Symbol.iterator ব্যবহার করে অ্যারের ইটারেটর তৈরি করা হয়েছে।


5. Global Symbols

ES6 এ একটি নতুন কনসেপ্ট যোগ হয়েছে যার নাম Global Symbols। আপনি যদি এমন একটি Symbol তৈরি করতে চান যা একাধিক স্কোপে এককভাবে ব্যবহার হতে পারে, তবে Symbol.for() মেথড ব্যবহার করতে পারেন। এটি একটি গ্লোবাল Symbol রেজিস্ট্রির মাধ্যমে একই নামের Symbol ফেরত দেয়।

উদাহরণ:

const globalSym1 = Symbol.for('globalSymbol');
const globalSym2 = Symbol.for('globalSymbol');

console.log(globalSym1 === globalSym2);  // true

এখানে, Symbol.for() ব্যবহার করে তৈরি করা দুটি Symbol একই থাকে, কারণ এটি গ্লোবাল রেজিস্ট্রির মধ্যে সংরক্ষিত থাকে এবং একই নামের জন্য একই Symbol ফেরত দেয়।


6. Symbol.iterator এবং Custom Iterables

আপনি নিজেও Symbol.iterator মেথড ব্যবহার করে একটি কাস্টম iterable অবজেক্ট তৈরি করতে পারেন। এই পদ্ধতিতে, আপনি ইটারেটর তৈরি করে অবজেক্টের উপাদানগুলো একে একে প্রাপ্ত করতে পারবেন।

উদাহরণ:

const myIterable = {
  data: ['apple', 'banana', 'cherry'],
  [Symbol.iterator]() {
    let index = 0;
    const data = this.data;
    return {
      next() {
        if (index < data.length) {
          return { value: data[index++], done: false };
        } else {
          return { done: true };
        }
      }
    };
  }
};

for (const fruit of myIterable) {
  console.log(fruit);  // apple, banana, cherry
}

এখানে, myIterable অবজেক্টে Symbol.iterator মেথড ব্যবহার করে একটি কাস্টম ইটারেটর তৈরি করা হয়েছে, যা for...of লুপে ব্যবহার করা হচ্ছে।


সারাংশ

  • Symbol ES6-এ নতুন প্রিমিটিভ ডেটা টাইপ যা ইউনিক এবং অপরিবর্তনীয় মান তৈরি করে।
  • এটি প্রোপার্টি নামের সংঘর্ষ প্রতিরোধে সহায়তা করে এবং গোপনীয় প্রোপার্টি তৈরি করতে ব্যবহৃত হয়।
  • Global Symbols এবং Symbol.iterator এর মাধ্যমে আরও উন্নত কাস্টম ইটারেবল অবজেক্ট তৈরি করা সম্ভব।
  • Symbol.for() মেথড গ্লোবাল রেজিস্ট্রিতে Symbol রেজিস্টার করতে ব্যবহৃত হয়, যা একাধিক স্কোপে এককভাবে ব্যবহৃত হতে পারে।
Content added By
Promotion

Are you sure to start over?

Loading...