آشنایی با دیتا تایپ undefined در زبان برنامه نویسی جاوا اسکریپت


فرض کنید که یک متغیر ساده در جاوا اسکریپت ساخته ایم اما هیچ مقداری را به آن اختصاص نداده ایم و آن را خالی رها کرده ایم. با وجود آن که این متغیر از نظر ما خالی است، اما باز هم مقداری در آن وجود دارد؛ این مقدار، همان undefined یا «تعریف نشده» است.

به خاطر داشته باشید
واژه ی انگلیسی Define به معنی «تعریف کردن چیزی» است و پیشوند un در ابتدای این فعل و پسوند ed در انتها، آن را به یک صفت تبدیل ساخته که معنای آن «تعریف نشده» است.

برای روشن تر شدن این مسئله، مثال زیر را مد نظر قرار می دهیم:

var myVariable;

if (myVariable === undefined) {
    message = "myVariable is undefined";
} else {
    message = "myVariable is defined";
}

همان طور که در مثال فوق مشاهد می کنیم، متغیری ساخته ایم تحت عنوان myVariable اما هیچ گونه Value یا مقداری به آن اختصاص نداده ایم. سپس از یک دستور شرطی استفاده کرده ایم با این مضمون که اگر مقدار متغیر myVariable مساوی با دیتا تایپ undefined بود، مقدار استرینگی myVariable is undefined را به معنی «متغیر myVariable تعریف نشده است» به متغیری تحت عنوان message اختصاص دهد و در غیر این صورت، مقدار استرینگی myVariable is defined به معنی «متغیر myVariable تعریف شده است» به متغیر message اختصاص دهد (در آموزش های آتی در مورد دستورات شرطی به تفصیل صحبت خواهیم کرد.)

نکته
توجه داشته باشیم که در مثال بالا به جای == از === استفاده نموده ایم چرا که اگر از == استفاده نماییم، مفسر جاوا اسکریپت چک می کند ببیند که آیا مقدار myVariable آیا null است یا خیر و این در حالی است که === چنین چیزی را چک نمی کند. در ضمن توجه داشته باشیم که مقدار null برابر با undefined نیست.

به هر حال، از آن جا که متغیر myVariable تعریف شده اما هیچ مقداری به آن اختصاص نیافته است، دستور شرطی برنامه ی ما وارد else خواهد شد.

آشنایی با اپراتور typeof
این اپراتور یک استرینگ باز می گرداند که نشانگر تایپ یا نوع عملوند قرار گرفته پس از آن است. در جدول زیر، لیستی از مقادیر رایجی که اپراتور typeof می تواند بازگرداند را مشاهده می کنیم:

تایپ خروجی
Undefined "undefined"
Null "object"
Boolean "boolean"
Number "number"
String "string"
Symbol "symbol"
Function object "function"
به خاطر داشته باشید
در برنامه نویسی، اصطلاح Operant یا عملوند به هر چیزی اطلاق می گردد که بتوان محاسباتی یا کاری روی آن انجام داد. به طور مثال، در دستور 2 + 1، اعداد 1 و 2 عملوند هستند و علامت + هم Operator یا عملگر نامیده می شود.

به منظور آشنایی بیشتر با اپراتور typeof به مثال های زیر توجه کنید:

// Numbers
typeof 37 === 'number';

typeof "SokanAcademy.com" === 'string';

// Booleans
typeof true === 'boolean';

// Symbols
typeof Symbol() === 'symbol'

// Objects
typeof new Date() === 'object';

// Functions
typeof function(){} === 'function';

// Undefined
typeof undefined === 'undefined';

کلیه ی این توضیحات را ارائه کردیم تا به مثال آخر برسیم! در واقع، در مثال فوق به جای دستور myVariable === undefined می توان از اپراتور typeof نیز به شکل زیر استفاده کرد:

var myVariable;

if (typeof myVariable === 'undefined') {
    message = "myVariable is undefined";
} else {
    message = "myVariable is defined";
}

حال ممکن است این سوال پیش بیاید که مزیت استفاده از اپراتور typeof به این شکل در دستورات شرطی چیست؟ در پاسخ به چنین سوالی بایستی گفت که اگر متغیر مد نظری که پس از typeof استفاده می شود پیش از این تعریف نشده باشد، مفسر جاوا اسکریپت ارور نمی دهد. برای روشن تر شدن این مسئله، به دو مثال زیر توجه کنید:

// myVariable has not been declared before
if (typeof myVariable === 'undefined') { // evaluates to true without errors
    message = "myVariable is undefined";
} else {
    message = "myVariable is defined";
}

if (myVariable === undefined) { // throws a ReferenceError
    message = "myVariable is undefined";
} else {
    message = "myVariable is defined";
}

همان طور که در مثال فوق می بینیم، متغیر myVariable تعریف نشده اما در دستورات شرطی مورد استفاده قرار گرفته است. اگر دستور شرطی اول را اجرا کنید، برنامه به درستی اجرا شده و نتیجه در معرض دید ما قرار می گیرد اما اگر دستور شرطی دوم را اجرا کنید، ارور دریافت خواهید کرد!

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
== دقت کمتری به === دارد مثلا: 0==false جواب true می دهد اما 0===false جواب false میدهد.== اجبار میکنه که نوع ها یکی بشه و جواب روtrue میکنه اما === این طور نیست و برابری بدون نوع اجبار است equality without type coercion
Persian
Persian
سلام و خدا قوت به عزیزان.
در این دوره ی آموزشی غالبا توضیحات زیبا و کاملی رو شاهد هستیم که جای تحسین داره. اما گاهی یکمرتبه موضوعی بدون هیچ توضیح مناسبی رها میشه!
مثلا درباره ی مفهوم متغیرها توضیحات بسیاری رو دریافت کردیم. اما هیچ توضیحی درمورد توابع شاهد نبودیم، درحالی که در خود آموزش، مرتب از اونها استفاده میشه.
و یا من در آخر نفهمیدم که == و === دقیقا چه چیزی رو چک میکنند!
شاید هم آموزش بقدری روان بوده که انتظار بنده حقیر رو بالا برده!
با سپاس