TheCodəPod
این موضوع توی پایتون هم اینجوریه که : وقتی تو پایتون مینویسید print(2 + 2) توجه کردید چرا خروجی 4 است و نه 22 ؟ در واقع پشت این اتفاق ساده یک فلسفه قدرتمند در پایتون پنهان شده است فلسفه ای به نام Object-Oriented Programming یا برنامه نویسی شئ گرایی در…
این موضوع Polymorphism تو دنیای واقعی مثل ادمی که هرجا ی رنگی داره
پیش من بد تورو میگه پیش تو بد منو 😶🌫️
پیش من بد تورو میگه پیش تو بد منو 😶🌫️
👏4🤣4💩1👌1
تبدیل آبجکت به Primitive توی جاوااسکریپت
خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع میکنی (
✋ اول اینو بدون
برخلاف زبانهایی مثل پایتون یا ++C، توی جاوااسکریپت نمیتونی بیای رفتار عملگرها رو مستقیم تغییر بدی.
یعنی خبری از متدهای جادویی (Magic Methods) مثل
پس نمیتونی بگی: "آبجکت من وقتی با + جمع شد، فلان کارو بکن!"
👈 جاوااسکریپت قبل از هر عملیات، آبجکتهارو خودکار تبدیل به primitive میکنه. بعد تازه میره سراغ اجرای اون عملگر.
📌 حالا اصلا primitive یعنی چی؟
توی جاوااسکریپت دو نوع داده اصلی داریم:
نوع اول 👈 Primitive ها: سادهترین نوع دادهها مثل number, string, boolean, null, undefined, symbol, bigint.
نوع دوم 👈 Objects: هر چیزی غیر از primitive ها! مثل object
حالا وقتی جاوااسکریپت نیاز داره روی یه آبجکت عملیاتی انجام بده (مثل جمع، تفریق، یا پرینت)، باید اون رو تبدیل کنه به یکی از primitive ها.
🔑 ماجرا با هینت (hint) شروع میشه
جاوااسکریپت بسته به شرایط مختلف، از سه تا hint استفاده میکنه تا بفهمه آبجکت رو به چی تبدیل کنه:
حالت اول 👈 "string": وقتی انتظار رشته داره.
مثال:
حالت دوم 👈 "number": وقتی نیاز به عدد هست.
مثال:
حالت سوم 👈 "default": وقتی جاوااسکریپت مطمئن نیست (مثل عملگر + که هم جمع عددی انجام میده هم رشتهها رو بهم میچسبونه).
مثال:
⚙️ الگوریتم تبدیل
وقتی یه آبجکت توی همچین موقعیتی باشه، جاوااسکریپت این مراحل رو میره جلو:
اگه متد obj[Symbol.toPrimitive](hint) وجود داشته باشه 👈 از همون استفاده میکنه.
اگه هینت string باشه 👈 اول متود toString() رو صدا میزنه، اگه وجود نداشت میره سراغ متود valueOf().
اگه هینت number یا default باشه 👈 اول متود valueOf() رو صدا میزنه، و اگه وجود نداشت میره سراغ متود toString().
📦 اگه چیزی پیادهسازی نکنیم چی؟
متود toString() برای یه آبجکت معمولی به صورت پیش فرض این رو برمیگردونه:
مثال:
متود valueOf() هم خود آبجکت رو برمیگردونه (که بیمصرفه) 🫤
🔧 مثال کاستومایز شده
حالا اگه بخوای رفتار رو کنترل کنی:
⚠️ نکته مهم:
متود های
📊 مقایسه با زبانهای دیگه
توی پایتون یا ++C میتونی مستقیماً رفتار عملگرها رو تغییر بدی (
ولی توی جاوااسکریپت، عملگرها دستکاری نمیشن.
فقط میتونی تعیین کنی وقتی آبجکت به primitive تبدیل شد، دقیقا چه مقداری برگرده.
📝 جمعبندی
جاوااسکریپت همیشه آبجکتها رو قبل از عملیات تبدیل به primitive میکنه.
سه حالت داره: "string", "number", "default".
متدهای کلیدی: Symbol.toPrimitive, toString, valueOf.
خب خب خب…
تا حالا فکر کردی وقتی دو تا آبجکت رو با هم جمع میکنی (
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
TheCodəPod
Photo
استفاده از Skill Icons در README گیت هاب
اگه میخوای صفحهی پروفایل یا پروژههات تو گیتهاب حرفهایتر و چشمگیرتر بشه، میتونی از Skill Icons استفاده کنی!
این آیکونها رو خیلی راحت میتونی به README اضافه کنی. کافیه این کد رو بذاری:
📌 توی قسمت
📌 با
بعد از اینکه آیکون ها و تم رو کاستوم کردی، کافیه کدش رو بزاری تو فایل README پروفایل یا پروژهات و از خروجی لذت ببری!
👨💻 نتیجهاش؟ یه README خفن جذاب که همه تو کفش میرن!
اگه میخوای صفحهی پروفایل یا پروژههات تو گیتهاب حرفهایتر و چشمگیرتر بشه، میتونی از Skill Icons استفاده کنی!
این آیکونها رو خیلی راحت میتونی به README اضافه کنی. کافیه این کد رو بذاری:
[](https://skillicons.dev/)
📌 توی قسمت
i= اسم تکنولوژیهایی که میخوای رو با کاما جدا کن (html, css, js و …).📌 با
theme=dark یا theme=light هم میتونی تم رو تغییر بدی.بعد از اینکه آیکون ها و تم رو کاستوم کردی، کافیه کدش رو بزاری تو فایل README پروفایل یا پروژهات و از خروجی لذت ببری!
👨💻 نتیجهاش؟ یه README خفن جذاب که همه تو کفش میرن!
❤3👍1