Type Coercion و Type conversion در جاوا اسکریپت


شاید تا حالا دیده باشید توی انجمن های برنامه نویسی یا گروه ها ، جاوااسکریپت رو تمسخر میکنن یا میم های فان راجبش میسازن . یکی از اون تاپیک ها تبدیل نوع داده (type conversion) هستش .

بزارید یک مثال براتون بزنم :

فرض کنید توی زبان خوش خط و خالی مثل پایتون این جمع رو انجام بدین 1 + "1"

پایتون بهتون این ارور رو میده :

TypeError: unsupported operand type(s) for +: 'int' and 'str'

با زبان بی زبانی داره میگه آقا جا فازت چیه داری string رو با int جمع میزنی

ولی از اونجایی که جاوااسکریپت خیلی مهربونه و به هیچی نه نمیگه جواب 1 + "1" رو بهتون "11" بر میگردونه. جالب نیست؟؟؟?

خب بریم ببینیم علتش چیه ؟؟؟

توی جاوااسکریپت یه دونه type conversion داریم و یه دونه هم type coercion

خب اول راجب type conversion صحبت کنیم :

توی جاوااسکریپت سه نوع تبدیل روال و معمولی داریم string conversion ، numeric conversion ، Boolean conversion که خب از اسمشون معلومه چکار میکنن و خیلی نیاز به توضیح نداره

اما بریم سراغ اصل داستان type coercion :

همین طور که از اسمش معلومه ما اینجا یه نوع تبدیل داده اجباری داریم که اتفاق میوفته در واقع بخواییم یه تعریفی از type coercion داشته باشیم :

به کل پروسه ای که type یک value به type دیگه تبدیل میشه اونم به صورت اتوماتیک و ضمنی (implicit) type coercion میگیم

اجازه بدین چندتا مثال ببینیم تا بهتر درکش کنیم :

مثال اول : 10 = 3 - "10" - "23"

توی این مثال اپراتور تفریق مثل یک ماشه یا محرک (trigger) عمل میکنه در واقع توی پس زمینه جاوااسکریپت میاد نوع داده ای string رو به عدد تبدیل میکنه ، نه تنها تفریق بلکه ضرب ، تقسیم ، توان و ..... هم همین خصلت رو دارن یعنی همشون پس قضیه میان اول تبدیل داده اجباری رو انجام میدن و بعد عملیات خودشون رو روی اون مقادیر اعمال میکنن

اما عملگر + مثل اینها رفتار نمیکنه و ساز مخالف میزنه یعنی میاد میبینه یه طرف قضیه اگر string باشه (میخواد "1" باشه یا "😎Mohammad ") با اون طرف قضیه پیوندشون (concatenate) میده

خب ، برگردیم روی مثال ، جاوااسکریپت اول میاد چک میکنه اپراتور ما چیه ؟؟ که توی این مثال تفریق هستش خب میفهمه که باید type coercion انجام بده پس "23" تبدیل میشه به نوع عددی 23 میره جلوتر باز میبینه تفریق هستش پس "10" رو تبدیل میکنه به 10 و در آخر 3 هم که خودش عدده پس کاری باهاش نداره و در آخر جواب ما میشه 10

مثال دوم : 45 = "5" + 2 * "3" - "10"

خب همون طور که میدونید تو برنامه نویسی چون ضرب تقدمش بیشتره اول 2 در 3 ضرب میشه اما مثل همیشه توی جاوااسکریپت قبلش "3" طبق قانون type coercion تبدیل میشه به نوع داده عددی 3 و بعدش عمل ضرب رو انجام میده که میشه 6 و بعدش با 10 عددی (نه string) تفریق میشه و حاصل میشه 4 عددی ، اما وقتی به اپراتور جمع میرسه دیگه نوع داده ای تغییر نمیکنه یعنی "5" همون string می مونه و عمل concatenate رو با 4 انجام میده و جواب آخر ما میشه 45 اما "45" از نوع string

برای همینه میگن best practice اینه از === به جای == برای مقایسه توی جاوااسکریپت استفاده بکنید چرا؟ چون == خودش باعث type coercion میشه یعنی 5 == "5" رو true برمیگردونه اما اگه از === استفاده بکنیم علاوه بر مقدارشون که چک میشه نوع داده ای هم چک میشه و از همه مهم تر type coercion رخ نمیده پس 5 === "5" میشه false و از باگ های عجیب غریب تو برنامه جلوگیری میکنه

امیدوارم از مقاله نهایت استفاده رو کرده باشید و اگر فکر میکنید جایی رو اشتباه گفتم یا نکته ای رو بلدین بگین که ویرایش یا اضافه کنم