تبدیل نوع ECMAScript

یکی از مهم‌ترین ویژگی‌های همه زبان‌های برنامه‌نویسی این است که توانایی تبدیل نوع‌ها را دارند.

ECMAScript به توسعه‌دهندگان تعداد زیادی روش ساده برای تبدیل نوع‌ها ارائه می‌دهد.

بیشتر نوع‌ها دارای روش‌های ساده برای تبدیل هستند، همچنین چندین روش جهانی برای تبدیل‌های پیچیده وجود دارد. در هر صورت، در ECMAScript، تبدیل نوع‌ها یک عملیات کوتاه است.

تبدیل به رشته

جالبترین نکته در مورد مقادیر اولیه Boolean، اعداد و رشته‌های ECMAScript این است که آنها اوبجکت‌های جعلی هستند، این بدان معناست که آنها در واقع ویژگی‌ها و توابع دارند.

برای مثال، برای دریافت طول رشته، می‌توانید از کد زیر استفاده کنید:

var sColor = "red";
alert(sColor.length);	// خروجی "3"

با این حال، حتی اگر "red" یک رشته نوع اولیه باشد، آن نیز دارای ویژگی length است که برای ذخیره اندازه رشته استفاده می‌شود.

در مجموع، سه نوع اصلی نوع‌های اولیه Boolean، اعداد و رشته‌ها توابع toString() دارند که می‌توانند مقادیر خود را به رشته تبدیل کنند.

توجه:شاید بپرسید، "آیا توابع toString() برای رشته‌ها هم وجود دارد؟ آیا این اضافی نیست؟" بله، اینطور است، اما ECMAScript همه اوبجکت‌ها را با توابع toString() تعریف کرده است، چه آنها اوبجکت‌های جعلی باشند و چه واقعی. زیرا نوع رشته به عنوان یک اوبجکت جعلی در نظر گرفته می‌شود، بنابراین باید توابع toString() داشته باشد.

روش toString() از نوع Boolean فقط "true" یا "false" نمایش می‌دهد، که نتیجه از مقدار متغیر تعیین می‌شود:

var bFound = false;
alert(bFound.toString());	// خروجی "false"

روش toString() از نوع Number بسیار خاص است، که دو حالت دارد، یعنیالگوی پیش‌فرضوالگوی پایهدر حالت پیش‌فرض، روش toString() فقط مقدار عددی را به صورت متنی نمایش می‌دهد (چه عددی، چه عدد اعشاری و چه به صورت عدد علمی)، به عنوان مثال:

var iNum1 = 10;
var iNum2 = 10.0;
alert(iNum1.toString());	// خروجی "10"
alert(iNum2.toString());	// خروجی "10"

توضیح:در حالت پیش‌فرض، بی‌موضوع از چه روشی برای بیان اعداد استفاده شده باشد، روش toString() از نوع Number به فرمتی دهی اعداد بازمی‌گردد. بنابراین، اعداد بیان شده به صورت عددی هشتی یا شانزده‌ای به فرمتی دهی نمایش داده می‌شوند.

با استفاده از الگوی پایه روش toString() از نوع Number، می‌توان با الگوهای مختلفپایهاعداد را نمایش دهید، به عنوان مثال، پایه اعداد دودویی 2 است، پایه اعداد هشتی 8 است، و پایه اعداد شانزده‌ای 16 است.

پایهاین تنها نوع دیگری از جمع برای تبدیل به پایه دیگر است، که پارامتر روش toString() است:

var iNum = 10;
alert(iNum.toString(2));	// خروجی "1010"
alert(iNum.toString(8));	// خروجی "12"
alert(iNum.toString(16));	// خروجی "A"

در مثال‌های قبلی، عدد 10 به سه شکل مختلف نمایش داده شده است: فرمتی دودویی، فرمتی هشتی و فرمتی شانزده‌ای. HTML از فرمتی شانزده‌ای برای نمایش هر رنگ استفاده می‌کند، که در پردازش اعداد در HTML بسیار مفید است.

توضیح:دریافت toString(10) برای اعداد مشابه به استفاده از toString() است، هر دو فرمتی از اعداد دهی هستند.

مطالعه کنید:

لطفاً به دستورالعمل JavaScriptدر مورد جزئیات مربوط به روش toString() اطلاعات ارائه می‌شود:

تبدیل به عدد

ECMAScript دو روش برای تبدیل مقادیر اولیه غیرعددی به اعداد ارائه می‌دهد، یعنی parseInt() و parseFloat().

همانطور که ممکن است فکر کنید، اولی مقادیر را به عدد صحیح تبدیل می‌کند و دومی مقادیر را به عدد اعشاری تبدیل می‌کند. تنها زمانی این روش‌ها می‌توانند به درستی کار کنند که به رشته‌ها (String) فراخوانی شوند؛ در غیر این صورت NaN برمی‌گردانند.

parseInt()

قبل از اینکه parseInt() و parseFloat() بتوانند یک رشته را به عنوان مقادیر عددی تشخیص دهند، آنها به دقت آن رشته را تحلیل می‌کنند.

روش parseInt() ابتدا به حرف در موقعیت 0 نگاه می‌کند و بررسی می‌کند که آیا حرف معتبر عددی است یا خیر؛ اگر نه، این روش NaN را برمی‌گرداند و دیگر عملیات را انجام نمی‌دهد. اما اگر حرف معتبر عددی باشد، این روش به حرف در موقعیت 1 نگاه می‌کند و بررسی مشابهی انجام می‌دهد. این فرآیند ادامه دارد تا به حرف غیرمعتبر عددی برسد، در این صورت parseInt() رشته‌ای که قبل از این حرف قرار دارد را به عدد تبدیل می‌کند.

مثلاً اگر بخواهیم رشته "12345red" را به عدد تبدیل کنیم، parseInt() 12345 را برمی‌گرداند، زیرا هنگام بررسی به حرف r می‌رسد، فرآیند بررسی متوقف می‌شود.

مقادیر عددی رشته شامل در رشته به درستی به عدد تبدیل می‌شوند، به عنوان مثال "0xA" به درستی به عدد 10 تبدیل می‌شود. اما رشته "22.5" به 22 تبدیل می‌شود زیرا برای اعداد صحیح، نقطه یک کاراکتر غیرمجاز است.

برخی از مثال‌ها به شرح زیر است:

var iNum1 = parseInt("12345red");	//برگرد به 12345
var iNum1 = parseInt("0xA");	//برگرد به 10
var iNum1 = parseInt("56.9");	//برگرد به 56
var iNum1 = parseInt("red");	//برگرد به NaN

روش parseInt() همچنین دارای یک حالت پایه است که می‌تواند رشته‌های دودویی، هشتمی، شانزده‌ای یا هر نظام عددی دیگر را به عدد صحیح تبدیل کند. پایه توسط پارامتر دوم روش parseInt() مشخص می‌شود، بنابراین برای تبدیل مقادیر شانزده‌ای، باید به این صورت از روش parseInt() استفاده کرد:

var iNum1 = parseInt("AF", 16);	//برگرد به 175

البته، برای دودویی، هشتمی و حتی دسیم (مود默认)، می‌توان به این صورت از روش parseInt() استفاده کرد:

var iNum1 = parseInt("10", 2);	//برگرد به 2
var iNum2 = parseInt("10", 8);	//برگردان 8
var iNum3 = parseInt("10", 10);	//برگردان 10

اگر عدد دهی شامل پیش‌درآمد 0 باشد، بهتر است از عدد پایه 10 استفاده کنید تا به طور اتفاقی به ارزش اکسیادسیمال نرسید. به عنوان مثال:

var iNum1 = parseInt("010");	//برگردان 8
var iNum2 = parseInt("010", 8);	//برگردان 8
var iNum3 = parseInt("010", 10);	//برگردان 10

در این کد، دو خط کد رشته "010" را به یک عدد تبدیل می‌کنند. خط اول این رشته را به عنوان ارزش اکسیادسیمال در نظر می‌گیرد، به همان روشی که در خط دوم (با تعیین عدد پایه به 8) انجام می‌شود. در نهایت، iNum3 برابر با 10 است، زیرا عدد پایه در آخرین خط 10 تعیین شده است.

نگری کنید

لطفاً به دستورالعمل JavaScriptجزئیات مربوط به روش parseInt() ارائه شده است:parseInt()استفاده کنید.

parseFloat()

روش parseFloat() به روش parseInt() مشابهی عمل می‌کند، از موقعیت 0 شروع به بررسی هر کاراکتر می‌کند، تا زمانی که به اولین کاراکتر غیرمعتبر برسد، سپس رشته‌ای که قبل از این کاراکتر قرار دارد را به عدد تبدیل می‌کند.

اما برای این روش، نقطه کوچک اولین که ظاهر می‌شود، یک کاراکتر معتبر است. اگر دو نقطه کوچک وجود داشته باشد، نقطه کوچک دوم به عنوان غیرمعتبر در نظر گرفته می‌شود. parseFloat() کاراکترهای قبل از این نقطه کوچک را به عدد تبدیل می‌کند. این意味着 که رشته "11.22.33" به 11.22 تبدیل می‌شود.

یک تفاوت دیگر در استفاده از روش parseFloat() این است که شماره‌های浮پونکتیل باید به صورت دهی نشان داده شوند، نه هگزادسیمال یا اکسیادسیمال. این روش اعداد پیش‌درآمدی 0 را نادیده می‌گیرد، بنابراین عدد اکسیادسیمال 0102 به 102 تبدیل می‌شود. برای عدد هگزادسیمال 0xA، این روش NaN برمی‌گردانند، زیرا در اعداد浮پونکتیل، x یک کاراکتر معتبر نیست. (توضیح:در تست‌ها، پیاده‌سازی‌های خاص مرورگر به جای NaN، 0 را برمی‌گردانند.)

علاوه بر این، روش parseFloat() هیچ الگوی پایه‌ای ندارد.

در اینجا چند مثال از استفاده از روش parseFloat() آورده شده است:

var fNum1 = parseFloat("12345red");	//برگردان 12345
var fNum2 = parseFloat("0xA");	//برگردان NaN
var fNum3 = parseFloat("11.2");	//برگردان 11.2
var fNum4 = parseFloat("11.22.33");	//برگردان 11.22
var fNum5 = parseFloat("0102");	//برمی‌گردد به 102
var fNum1 = parseFloat("red");	//برمی‌گردد به NaN

آزمایش کنید

نگری کنید

لطفاً به دستورالعمل JavaScriptاطلاعات مربوط به متد parseFloat() ارائه شده است:parseFloat()استفاده کنید.

تبدیل اجباری

شما همچنین می‌توانید ازتبدیل اجباری (type casting)برای مدیریت نوع تبدیل مقدار استفاده می‌شود. استفاده از تبدیل اجباری می‌تواند به دسترسی به مقدارهای خاصی حتی اگر آنها از نوع دیگری باشند، کمک کند.

نکته نویسنده:کلمه cast به معنای "铸造" است که بسیار با معنای "تبدیل اجباری" همخوانی دارد.

۳ نوع تبدیل اجباری موجود در ECMAScript به شرح زیر است:

  • Boolean(value) - مقدار داده شده را به نوع Boolean تبدیل می‌کند؛
  • Number(value) - مقدار داده شده را به عدد تبدیل می‌کند (می‌تواند عدد صحیح یا عدد اعشاری باشد);
  • String(value) - مقدار داده شده را به رشته تبدیل می‌کند؛

با استفاده از یکی از این سه تابع تبدیل، یک مقدار جدید ایجاد می‌شود که مقدار تبدیل شده مستقیم از مقدار اصلی را نگه می‌دارد. این می‌تواند به نتایج غیرمنتظره‌ای منجر شود.

تابع Boolean()

وقتی مقدار مورد تبدیل حداقل یک کاراکتر رشته، عدد غیرصفر یا شیء است، تابع Boolean بازمی‌گردد به true. اگر مقدار خالی است، عدد صفر، undefined یا null، آن بازمی‌گردد به false.

می‌توان با استفاده از کد زیر تبدیل اجباری Boolean را تست کرد:

var b1 = Boolean("");		//false - رشته خالی
var b2 = Boolean("hello");		//true - رشته غیرخالی
var b1 = Boolean(50);		//true - عدد غیرصفر
var b1 = Boolean(null);		//false - null
var b1 = Boolean(0);		//false - صفر
var b1 = Boolean(new object());	//true - شیء

متد Number()

تبدیل اجباری متد Number() مشابه روش parseInt() و parseFloat() است، اما آن فقط کل مقدار را تبدیل می‌کند، نه مقدار بخشی.

یاد می‌آوری که متد parseInt() و parseFloat() فقط رشته‌ای را که قبل از اولین کاراکتر نامعتبر قرار دارد را تبدیل می‌کنند، بنابراین "1.2.3" به ترتیب به "1" و "1.2" تبدیل می‌شود.

با استفاده از Number() برای تبدیل اجباری، "1.2.3" NaN خواهد برگرداند، زیرا کل مقادیر رشته نمی‌تواند به عدد تبدیل شود. اگر مقادیر رشته به طور کامل قابل تبدیل باشند، Number() خواهد ارزیابی کرد که آیا باید روش parseInt() یا parseFloat() فراخوانی شود.

جدول زیر توضیح می‌دهد که با فراخوانی روش Number() برای مقادیر مختلف چه اتفاقی می‌افتد:

استفاده نتیجه
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number("1.2") 1.2
Number("12") 12
Number("1.2.3") NaN
Number(new object()) NaN
Number(50) 50

توابع String()

آخرین روش تبدیل اجباری String() ساده‌ترین است، زیرا می‌تواند هر مقادیری را به رشته تبدیل کند.

برای انجام این تبدیل اجباری، تنها کافی است که روش toString() مقادیری که به عنوان پارامتر ارسال می‌شود را فراخوانی کنید، یعنی 12 را به "12" تبدیل کنید، true را به "true" تبدیل کنید، false را به "false" تبدیل کنید و به همین ترتیب.

تفاوت بین تبدیل اجباری به رشته و فراخوانی روش toString() تنها این است که تبدیل اجباری مقادیر null و undefined می‌تواند رشته ایجاد کند بدون اینکه اشکال ایجاد شود:

var s1 = String(null);	//"null"
var oNull = null;
var s2 = oNull.toString();	//اشکال ایجاد خواهد شد

در هنگام کار با زبان‌های نوع ضعیف مانند ECMAScript، تبدیل اجباری نوع بسیار مفید است، اما باید اطمینان حاصل شود که از مقادیر صحیح استفاده می‌شود.