بررسی رشته در جاوا اسکریپت – از صفر تا صد


زمانی که میخواهیم به بررسی رشته در جاوا اسکریپت بپردازیم، typeof به خوبی عمل میکند، مگر این که از یک «پوشش شیء ابتدایی» استفاده شده باشد که رویه نامطلوبی محسوب میشود. بررسی این رشتهها در جاوا اسکریپت کمی دشوار است. این وضعیت مشابه بررسی NaN در جاوا اسکریپت است، اما خوشبختانه کار با رشتهها به مقدار زیادی آسان است. زمانی که این بررسی را انجام میدهیم، اگر یک مقدار از نوع رشته در جاوا اسکریپت باشد، typeof عملکرد خوبی دارد:
اما typeof در مورد رشتههایی که با new String() ساخته شدهاند عملکرد درستی ندارد. این نوع رشتهها به نام «پوشش شیء ابتدایی» (Primitive Object Wrapper) نامیده میشوند. ایجاد رشتههای پوشش شیء بسیار نادر است و چنان که در بخش بعدی توضیح خواهیم داد، عموماً توصیه نمیشود.
چرا پوشش شیئ ابتدایی بد است؟
اگر به راهنماهای مختلف توجه کنید میبینید که اغلب اعلام میکنند استفاده از پوشش شیء ابتدایی کار خوبی نیست. برای نمونه:
- راهنمای استایل گوگل برای جاوا اسکریپت میگوید هرگز از پوششهای شیء ابتدایی استفاده نکنید (+).
- داگلاس کراکفورد عموماً توصیه میکند که پوششهای شیء ابتدایی باید منسوخ شوند (+).
در واقع هیچ کسی وجود ندارد که توصیه به استفاده از آنها کرده باشد و پوششهای شیء ابتدایی مورد تنفر عمومی هستند.
چگونه از استفاده از پوشش شیئ اجتناب کنیم؟
شاید تنها جایی که بحث پوششهای شیء ابتدایی به کار میآید، در سؤالات مصاحبههای استخدامی باشد که عموماً به روشهای استفاده از typeof برای بررسی نوع مربوط هستند. در واقع، در ادامه سه روش برای فراخوانی یک رشته میبینید که تقریباً همه برنامهنویسان جاوا اسکریپت صرفاً از روش اول اطلاع دارند:
پوششهای شیئ سردرگمکننده هستند
ایجاد صریح پوشش با استفاده از عملکرد new یک رویه بد محسوب میشود. از سوی دیگر فراخوانی تابع بدون عملگر new کاملاً معتبر است، چون تلاش میکنیم تا ورودی را به نوع ابتدایی متناظر تبدیل کرده و یک مقدار از نوع ابتدایی بازگشت دهیم.
علاوه بر تلاش برای تغییر دادن مقدار بازگشتی typeof یک کاربرد دیگر نیز در مورد پوششهای شیء وجود دارد که موجب سردرگمی میشود و آن type coercion است. یک تابع میتواند بدون کلیدواژه new استفاده شود تا یک مقدار به نوع ابتدایی کاهش یابد. به کد زیر توجه کنید:
بنابراین استفاده از تابع پوشششی بدون کلیدواژه new یک روش مفید برای کاهش یک مقدار به یک نوع ابتدایی است. از سوی دیگر، استفاده از کلیدواژه new یک پوشش شیء ابتدایی ایجاد میکند که رویه بدی محسوب میشود.
اگر پوششهای شیئ بد هستند، چرا وجود دارند؟
در جاوا اسکریپت کلاً سه نوع پوشش شیء وجود دارند که به انواع ابتدایی اجازه میدهند که مانند اشیا رفتار کنند. جاوا اسکریپت به صورت خودکار پوشش شیء ابتدایی را در پشت صحنه در موارد ارجاع کد به یک تابع یا مشخصه پروتوتایپ فراخوانی میکند.
برای نمونه این حالت در زمان بررسی طول یک رشته با استفاده از مشخصه String.prototype.length یا جایگزینی همه رشتههای فرعی درون یک رشته با استفاده از تابع ()String.prototype.replace به کار میآید:
در هر دوی این موارد، جاوا اسکریپت پوشش شیء را در پسزمینه برای ایجاد امکان ارجاع به مشخصه و متدهای شیء فراخوانی میکند.
تطبیق با یک پوشش شیئ
شاید از خود بپرسید در صورتی که پوششهای شیء مختلفی در کد وجود داشته باشند و بخواهید یک رشته را بررسی کنید، باید چه کار بکنید؟ در این صورت باید با دو قابلیت دیگر جاوا اسکریپت به نام کلیدواژه instanceof و تابع ()Object.prototype.toString.call آشنا باشید. در کد زیر با شیوه استفاده از تابع ()isString بهبودیافته آشنا خواهید شد:
سخن پایانی
به طور کلی typeof در کاربردهای روزمره برای بررسی رشته بسیار کارآمد است. اما رشتههای با پوشش شیء نیز در جاوا اسکریپت وجود دارند که در صورت نیاز مدیریت آنها نیز چندان دشوار نخواهد بود. در مورد انواع ابتدایی که درون شیء پوشش یافتهاند، کلیدواژه nstanceof و تابع instanceof keyword and the نوع مقدار را مشخص میسازند.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزشهای جاوا اسکریپت
- مجموعه آموزشهای برنامهنویسی
- آموزش جاوا اسکریپت (JavaScript)
- آموزش جاوا اسکریپت — مجموعه مقالات جامع وبلاگ فرادرس
- تمرین ساخت شیئ در جاوا اسکریپت (بخش اول) — راهنمای کاربردی
==