TheCodəPod
289 subscribers
269 photos
103 videos
7 files
165 links
باما همیشه بروز باشید =)
Download Telegram
تبدیل آبجکت به Primitive توی جاوااسکریپت

خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع می‌کنی (obj1 + obj2) یا از هم کم می‌کنی (obj1 - obj2) چه اتفاقی میفته؟ 🤔

✋ اول اینو بدون
برخلاف زبان‌هایی مثل پایتون یا ++C، توی جاوااسکریپت نمی‌تونی بیای رفتار عملگرها رو مستقیم تغییر بدی.
یعنی خبری از متدهای جادویی (Magic Methods) مثل __add__ یا __sub__ تو پایتون نیست.
پس نمی‌تونی بگی: "آبجکت من وقتی با + جمع شد، فلان کارو بکن!"

👈 جاوااسکریپت قبل از هر عملیات، آبجکت‌هارو خودکار تبدیل به primitive می‌کنه. بعد تازه میره سراغ اجرای اون عملگر.

📌 حالا اصلا primitive یعنی چی؟
توی جاوااسکریپت دو نوع داده اصلی داریم:

نوع اول 👈 Primitive ها: ساده‌ترین نوع داده‌ها مثل number, string, boolean, null, undefined, symbol, bigint.

نوع دوم 👈 Objects: هر چیزی غیر از primitive ها! مثل object {} و array []

حالا وقتی جاوااسکریپت نیاز داره روی یه آبجکت عملیاتی انجام بده (مثل جمع، تفریق، یا پرینت)، باید اون رو تبدیل کنه به یکی از primitive ها.

🔑 ماجرا با هینت (hint) شروع میشه

جاوااسکریپت بسته به شرایط مختلف، از سه تا hint استفاده می‌کنه تا بفهمه آبجکت رو به چی تبدیل کنه:

حالت اول 👈 "string": وقتی انتظار رشته داره.
مثال:
alert(user);  
anotherObj[user] = 123;


حالت دوم 👈 "number": وقتی نیاز به عدد هست.
مثال:
let n = +obj;  
let delta = date1 - date2;
let bigger = user1 > user2;


حالت سوم 👈 "default": وقتی جاوااسکریپت مطمئن نیست (مثل عملگر + که هم جمع عددی انجام میده هم رشته‌ها رو بهم می‌چسبونه).
مثال:
let total = obj1 + obj2;  
if (user == 1) { ... }


⚙️ الگوریتم تبدیل

وقتی یه آبجکت توی همچین موقعیتی باشه، جاوااسکریپت این مراحل رو میره جلو:

اگه متد obj[Symbol.toPrimitive](hint) وجود داشته باشه 👈 از همون استفاده می‌کنه.

اگه هینت string باشه 👈 اول متود toString() رو صدا می‌زنه، اگه وجود نداشت میره سراغ متود valueOf().

اگه هینت number یا default باشه 👈 اول متود valueOf() رو صدا می‌زنه، و اگه وجود نداشت میره سراغ متود toString().

📦 اگه چیزی پیاده‌سازی نکنیم چی؟
متود toString() برای یه آبجکت معمولی به صورت پیش فرض این رو برمی‌گردونه:
[object Object]

مثال:
let user = { name: "Ali" };

alert(user); // [object Object]
alert(user + 1); // [object Object]1


متود valueOf() هم خود آبجکت رو برمی‌گردونه (که بی‌مصرفه) 🫤


🔧 مثال کاستومایز شده

حالا اگه بخوای رفتار رو کنترل کنی:
let user = {
name: "Ali",
money: 100,

[Symbol.toPrimitive](hint) {
return hint === "string" ? `{User: ${this.name}}` : this.money;
}
};

alert(user); // "{User: Ali}" (string hint)
alert(+user); // 100 (number hint)
alert(user + 50); // 150 (default hint)


⚠️ نکته مهم:

متود های [Symbol.toPrimitive](hint)، toString() و valueOf() باید به عنوان خروجی یک primitive برگردونن


📊 مقایسه با زبان‌های دیگه

توی پایتون یا ++C می‌تونی مستقیماً رفتار عملگرها رو تغییر بدی (__add__، __str__ و …).

ولی توی جاوااسکریپت، عملگرها دست‌کاری نمی‌شن.
فقط می‌تونی تعیین کنی وقتی آبجکت به primitive تبدیل شد، دقیقا چه مقداری برگرده.


📝 جمع‌بندی

جاوااسکریپت همیشه آبجکت‌ها رو قبل از عملیات تبدیل به primitive می‌کنه.

سه حالت داره: "string", "number", "default".

متدهای کلیدی: Symbol.toPrimitive, toString, valueOf.
❤3
❤2👍1
❤1👍1😢1
❤2👍1
❤2👍1
❤2👍1
Please open Telegram to view this post
VIEW IN TELEGRAM
وقتی اولین بار وارد لینوکس میشی
🤣3🥰1
❤2
TheCodəPod
Photo
استفاده از Skill Icons در README گیت هاب

اگه می‌خوای صفحه‌ی پروفایل یا پروژه‌هات تو گیت‌هاب حرفه‌ای‌تر و چشم‌گیرتر بشه، می‌تونی از Skill Icons استفاده کنی!
این آیکون‌ها رو خیلی راحت می‌تونی به README اضافه کنی. کافیه این کد رو بذاری:
[![Skill Icons](https://skillicons.dev/icons?i=html,css,js,react,python,git,github&theme=dark)](https://skillicons.dev/)


📌 توی قسمت i= اسم تکنولوژی‌هایی که می‌خوای رو با کاما جدا کن (html, css, js و …).
📌 با theme=dark یا theme=light هم می‌تونی تم رو تغییر بدی.

بعد از اینکه آیکون ها و تم رو کاستوم کردی، کافیه کدش رو بزاری تو فایل README پروفایل یا پروژه‌ات و از خروجی لذت ببری!

👨‍💻 نتیجه‌اش؟ یه README خفن جذاب که همه تو کفش میرن!
❤3👍1
تو پست بعدی بهتون یاد میدم چجوری یدونه از اینا بزارید تو پروفایل گیت هاب خودتون تا پشمای همه فر بخوره 😉
❤2👍1