مقدمه

در درس قبل با نوع داده Symbol و نقش آن در ایجاد پراپرتی‌های یکتا آشنا شدیم. حالا می‌خواهیم با مفهومی کلیدی در رفتار اشیاء آشنا شویم: تبدیل شیء (Object) به مقدار اولیه (Primitive). این فرآیند زمانی رخ می‌دهد که شیء شما در موقعیتی قرار می‌گیرد که باید مانند یک مقدار ساده (رشته یا عدد) رفتار کند؛ مثلاً هنگام جمع شدن با یک مقدار دیگر، چاپ در خروجی، یا تبدیل صریح با String یا Number. دانستن این فرآیند به شما کمک می‌کند اشیاء هوشمندتر و منعطف‌تر طراحی کنید.

تبدیل Object به Primitive

اشیاء در جاوااسکریپت معمولاً به عنوان مقادیر ارجاعی رفتار می‌کنند و نمی‌توانند مستقیماً در جاهایی که مقدار اولیه لازم است استفاده شوند. اما جاوااسکریپت در صورت نیاز، تلاش می‌کند شیء را به یک مقدار اولیه تبدیل کند. این تبدیل هم می‌تواند خودکار باشد (در عملیات‌های جمع و مقایسه و ...) و هم به صورت صریح با متدهایی مثل String() و Number() انجام شود.

معمولاً این تبدیل در یکی از سه حالت زیر رخ می‌دهد:

  • زمانی که شیء را با + یا عملیات عددی استفاده می‌کنید.
  • هنگام تبدیل صریح با String() یا Number().
  • هنگام نمایش شیء در alert()، console.log() و ...

متدهای toString و valueOf

هر شیء به طور پیش‌فرض دو متد دارد: toString و valueOf. این متدها به جاوااسکریپت کمک می‌کنند تا شیء را به مقدار اولیه تبدیل کند. toString باید یک رشته برگرداند و valueOf می‌تواند هر مقدار اولیه را برگرداند:

Copy Icon JAVASCRIPT
let book = {
  title: "JS",
  toString() {
    return "Book: " + this.title;
  },
  valueOf() {
    return 100;
  }
};
console.log(String(book)); // "Book: JS"
console.log(Number(book)); // 100

جاوااسکریپت با توجه به نوع عملیات تصمیم می‌گیرد که toString یا valueOf را صدا بزند.

کنترل کامل تبدیل با Symbol.toPrimitive

در ES6 به بعد، می‌توانید با تعریف متد [Symbol.toPrimitive] رفتار تبدیل را به طور دقیق و حرفه‌ای کنترل کنید. این متد یک آرگومان hint می‌گیرد که مشخص می‌کند انتظار مقدار رشته، عدد یا حالت عادی را دارد:

Copy Icon JAVASCRIPT
let user = {
  name: "Lale",
  age: 30,
  [Symbol.toPrimitive](hint) {
    if (hint === "string") {
      return `user: ${this.name}`;
    } else {
      return this.age;
    }
  }
};
console.log(String(user));  // "user: Lale"
console.log(user + 5);      // 35  (30 + 5)

این روش کامل‌ترین کنترل روی تبدیل شیء به مقدار اولیه را در اختیار شما قرار می‌دهد.

کاربردهای عملی تبدیل Object به Primitive

با این تکنیک‌ها می‌توانید اشیائی بسازید که رفتار آن‌ها در عملیات‌های مختلف دقیقاً همان چیزی باشد که می‌خواهید؛ مثلاً یک حساب بانکی که با جمع شدن با عدد، مقدار پول را برگرداند یا با تبدیل به رشته، یک پیغام متنی نمایش دهد:

Copy Icon JAVASCRIPT
let bankAccount = {
  balance: 20000,
  [Symbol.toPrimitive](hint) {
    return hint === "string"
      ? "money: " + this.balance
      : this.balance;
  }
};
console.log("my account: " + bankAccount); //=> my account: money: 20000
console.log(bankAccount + 5000); // 25000

تبدیل شیء به مقدار اولیه در جاوااسکریپت مکانیزمی کلیدی برای ساخت اشیاء هوشمند و قابل استفاده در عملیات‌های مختلف است. با متدهای toString، valueOf و Symbol.toPrimitive می‌توانید این رفتار را به طور کامل کنترل کنید و برنامه‌هایی منعطف‌تر و حرفه‌ای‌تر بسازید.