انواع دادهی Null، Undefined و Boolean
همانطور که پیش از این اشاره شد در جاوا اسکریپت ۶ نوع دادهی اولیه (Primitive) وجود دارد. از این ۶ مورد، در رابطه با انواع عددی و رشتهای که از اهمیت بیشتری برخوردار هستند با جزئیات نسبتاً زیادی صحبت کردیم. در این بخش قصد داریم با ۳ نوع دادهی دیگر، یعنی انواع Null، Undefined و Boolean آشنا شویم. این انواع داده، برخلاف انواع رشتهای و عددی که میتوانند بینهایت مقدار مختلف داشته باشند، فقط میتوانند چند مقدار خاص داشته باشند. در واقع انواع Undefined و Null فقط یک مقدار و نوع Boolean فقط دو مقدار متفاوت میتوانند داشته باشند که در ادامهی این بخش با آنها آشنا میشویم. البته نوع دادهی دیگری به نام Symbol نیز وجود دارد که فعلاً از آن صرف نظر میکنیم.
نوع دادهی Undefined
در صورتی که متغیری را تعریف کنید و هیچ مقدار اولیهای برای آن در نظر نگیرید، نوع دادهی این متغیر Undefined خواهد بود و مقدار اولیهی آن نیز به صورت خودکار برابر با مقدار undefined قرار میگیرد. این یک مقدار ویژه است که نشاندهندهی مقداردهی نشدن یک متغیر است. هر چند میتوان این مقدار را به یک متغیر نسبت داد، اما تقریباً هیچگاه نباید چنین کاری انجام دهید و این مقدار همیشه باید به صورت خودکار به متغیرهای مقداردهی نشده نسبت داده شود.
توجه کنید که در جاوا اسکریپت، نوع دادهی متغیرها میتواند تغییر کند. مثلاً متغیری که در ابتدا با یک رشته مقداردهی شود از نوع String خواهد بود. اما در هر بخشی از برنامه میتوان مقدار جدیدی از نوعی دیگر (مثلاً یک عدد) به آن متغیر نسبت داد. که این کار باعث تغییر نوع متغیر نیز خواهد شد.
در صورت استفاده از عملگر typeof برای متغیرهای Undefined، مقدار "undefined" بازگردانده میشود. همچنین دقت کنید که استفاده از عملگر typeof برای متغیری که هنوز تعریف نشده است نیز همین مقدار را بازمیگرداند. به قطعه کد زیر توجه کنید.
let a = 10 , b = 'Hello' , c;
typeof a;
← "number"
typeof b;
← "string"
typeof c;
← "undefined"
typeof d;
← "undefined"
همانطور که مشاهده میکنید، نوع دادهی متغیر d که اصلاً تعریف نشده، با متغیر c که تعریف شده اما مقداردهی نشده، یکسان و برابر با undefined است. بنابراین بهتر است همیشه برای متغیرهایی که تعریف میکنیم یک مقدار اولیه هم در نظر بگیریم. در این صورت میتوانیم با بررسی نوع دادهی یک شناسه، از تعریف شدن یا نشدن یک متغیر با این شناسه مطمئن شویم.
تبدیل مقدار undefinded به نوع عددی، مقدار NaN و تبدیل آن به رشته، مقدار "undedfined" را برمیگرداند. توجه کنید که تفاوتی میان تبدیل ضمنی و تبدیل صریح وجود ندارد و نتیجه در هر دو حالت یکسان است. قطعه کد زیر این موضوع را روشنتر میکند.
Number(undefined);
← NaN
parseInt(undefined);
← NaN
3 * undefined;
← NaN
undefined + 3;
← NaN
undefined + '3';
← "undefined3"
String(undefined) + 3;
← "undefined3"
نوع دادهی Null
نوع دادهی بعدی Null است. این نوع داده نیز مانند نوع Undefined فقط یک مقدار میتواند داشته باشد و آن هم مقدار null است. مقدار null هم دقیقاً مانند undefined به معنی "هیچ مقداری" است. اما از نظر کاربرد، این دو نوع داده کاملاً با هم متفاوت هستند.
همانطور که پیشتر اشاره شد. شما هیچگاه نباید مقدار یک متغیر را برابر با مقدار undefined قرار دهید (البته این کار از نظر جاوا اسکریپت ممکن است و هیچ خطایی نیز تولید نمیکند). اما در مورد نوع Null این موضوع صادق نیست و برنامهنویس ممکن است در شرایط خاص، مقدار یک متغیر را برابر با null قرار دهد.
در واقع مقدار null برای یک متغیر، به این معنی است که این متغیر از نوع شئ یا Object است. اما هنوز به هیچ شئ خاصی اشاره نمیکند. در فصول بعدی که بیشتر در مورد اشیاء صحبت خواهیم کرد، این موضوع نیز برای شما روشنتر خواهد شد. یعنی تفاوت مقدار null و undefined در این است که، متغیری که از نوع Undefined باشد (یا مقدار undefined داشته باشد) کاملاً بیهویت است. اما متغیری که از نوع Null باشد (یا مقدار null داشته باشد)، از نوع Object است. اما هنوز به شئ خاصی اشاره نمیکند. لذا استفاده از عملگر typeof بر روی این نوع داده، مقدار "object" را برمیگرداند.
let a = null , b;
typeof a;
← "object"
typeof b;
← "undefined"
تبدیل مقدار null به مقدار عددی با استفاده از تابع Number (یا به صورت ضمنی)، مقدار صفر را بازمیگرداند. اما تبدیل آن با استفاده از توابع parseInt و parseFloat مقدار NaN را بازمیگرداند. همچنین تبدیل این مقدار به رشته، مقدار "null" را بازمیگرداند. نمونههایی از این تبدیلات را در قطعه کد زیر میبینید.
Number(null);
← 0
parseInt(null)
← NaN
null + 10;
← 10
null + '10';
← "null10"
نوع دادهی Boolean
این نوع داده میتواند یکی از دو مقدار true یا false را داشته باشد. از این نوع داده در دستورات شرطی استفاده میشود. لذا در فصل بعد که در مورد دستورات شرطی صحبت میکنیم، بیشتر از نوع Boolean استفاده خواهیم کرد. قطعه کد زیر نشان میدهد که هر متغیری که دارای مقدار true یا false باشد از نوع boolean خواهد بود.
let a = true , b = false;
typeof a;
← "boolean"
typeof b;
← "boolean"
تبدیل انواع مختلف داده به نوع Boolean از معمولترین تبدیلها در برنامهنویسی است. در بسیاری از موارد، تبدیل به نوع Boolean به صورت ضمنی انجام میشود. اما در صورت نیاز میتوان از تابع Boolean برای تبدیل انواع مختلف به نوع Boolean استفاده کرد. به قطعه کد زیر توجه کنید.
Boolean('Hello');
← true
Boolean(15);
← true
Boolean(Infinity);
← true
Boolean(null);
← false
همانطور که میبینید، بیشتر مقادیر در زمان تبدیل به نوع Boolean به مقدار true تبدیل میشوند. در واقع فقط چند مقدار خاص زیر در صورت تبدیل به نوع Boolean به مقدار false تبدیل میشوند و بقیهی مقادیر از انواع مختلف به مقدار true تبدیل میشوند.
- مقدار عددی صفر
- رشتهی تهی
- مقدار NaN
- مقدار null
- مقدار undefined
Boolean('0');
← true
Boolean('');
← false
Boolean(0);
← false
Boolean(NaN);
← false
Boolean(undefined);
← false
البته همانطور که اشاره شد، تبدیل به نوع Boolean در بسیاری از مواقع به صورت ضمنی انجام میشود. این کار معمولاً در زمان استفاده از ساختارهای شرطی انجام میشود که در فصل بعد در این رابطه صحبت خواهیم کرد. لازم به ذکر است که قوانین تبدیل ضمنی به نوع Boolean، با قوانین ذکر شدهی فوق کاملاً یکسان است.