مقدمه
در درس قبل با نوع داده Symbol و نقش آن در ایجاد پراپرتیهای یکتا آشنا شدیم. حالا
میخواهیم با مفهومی کلیدی در رفتار اشیاء آشنا شویم: تبدیل شیء (Object) به مقدار اولیه
(Primitive). این فرآیند زمانی رخ میدهد که شیء شما در موقعیتی قرار میگیرد که باید مانند
یک مقدار ساده (رشته یا عدد) رفتار کند؛ مثلاً هنگام جمع شدن با یک مقدار دیگر، چاپ در خروجی، یا
تبدیل صریح با String یا Number. دانستن این فرآیند به شما کمک میکند اشیاء هوشمندتر
و منعطفتر طراحی کنید.
تبدیل Object به Primitive
اشیاء در جاوااسکریپت معمولاً به عنوان مقادیر ارجاعی رفتار میکنند و نمیتوانند مستقیماً در
جاهایی که مقدار اولیه لازم است استفاده شوند. اما جاوااسکریپت در صورت نیاز، تلاش میکند شیء را به
یک مقدار اولیه تبدیل کند. این تبدیل هم میتواند خودکار باشد (در
عملیاتهای جمع و مقایسه و ...) و هم به صورت صریح با متدهایی مثل String() و
Number() انجام شود.
معمولاً این تبدیل در یکی از سه حالت زیر رخ میدهد:
- زمانی که شیء را با + یا عملیات عددی استفاده میکنید.
- هنگام تبدیل صریح با String() یا Number().
- هنگام نمایش شیء در alert()، console.log() و ...
متدهای toString و valueOf
هر شیء به طور پیشفرض دو متد دارد: toString و valueOf. این متدها به جاوااسکریپت
کمک میکنند تا شیء را به مقدار اولیه تبدیل کند. toString باید یک رشته برگرداند و
valueOf میتواند هر مقدار اولیه را برگرداند:
JAVASCRIPT
let book = {
title: "JS",
toString() {
return "Book: " + this.title;
},
valueOf() {
return 100;
}
};
console.log(String(book));
console.log(Number(book));
جاوااسکریپت با توجه به نوع عملیات تصمیم میگیرد که toString یا valueOf را صدا
بزند.
کنترل کامل تبدیل با Symbol.toPrimitive
در ES6 به بعد، میتوانید با تعریف متد [Symbol.toPrimitive] رفتار تبدیل را به طور دقیق و
حرفهای کنترل کنید. این متد یک آرگومان hint میگیرد که مشخص میکند انتظار مقدار رشته، عدد
یا حالت عادی را دارد:
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));
console.log(user + 5);
این روش کاملترین کنترل روی تبدیل شیء به مقدار اولیه را در اختیار شما قرار میدهد.
کاربردهای عملی تبدیل Object به Primitive
با این تکنیکها میتوانید اشیائی بسازید که رفتار آنها در عملیاتهای مختلف دقیقاً همان چیزی باشد
که میخواهید؛ مثلاً یک حساب بانکی که با جمع شدن با عدد، مقدار پول را برگرداند یا با تبدیل به
رشته، یک پیغام متنی نمایش دهد:
JAVASCRIPT
let bankAccount = {
balance: 20000,
[Symbol.toPrimitive](hint) {
return hint === "string"
? "money: " + this.balance
: this.balance;
}
};
console.log("my account: " + bankAccount);
console.log(bankAccount + 5000);
تبدیل شیء به مقدار اولیه در جاوااسکریپت مکانیزمی کلیدی برای ساخت اشیاء هوشمند و قابل استفاده در
عملیاتهای مختلف است. با متدهای toString، valueOf و Symbol.toPrimitive
میتوانید این رفتار را به طور کامل کنترل کنید و برنامههایی منعطفتر و حرفهایتر بسازید.