اشکالزدایی - بررسی وجود شیء در جاوااسکریپت


چگونه وجود یک شیء را در جاوااسکریپت بررسی کنم؟

آثار زیر:

if (!null)
   alert("GOT HERE");

اما این خطا میدهد:

if (!maybeObject)
   alert("GOT HERE");

خطا:

تعریف نشده است maybeObject.

پاسخ شماره ۱

شما میتوانید با اطمینان از عملگر typeof روی متغیرهای تعریفنشده استفاده کنید.

اگر به آن هر مقداری اختصاص داده شده باشد، از جمله null، typeof چیزی جز undefined برنمیگرداند. typeof همیشه یک رشته برمیگرداند.

بنابراین

if (typeof maybeObject != "undefined") {
   alert("GOT THERE");
}

پاسخ شماره ۲

در اینجا کلی نیمهحقیقت وجود دارد، پس فکر کردم برخی چیزها را روشنتر کنم.

در واقع شما نمیتوانید دقیقاً بگویید که آیا یک متغیر وجود دارد یا نه (مگر اینکه بخواهید هر خط دوم را داخل یک بلوک try-catch قرار دهید).

دلیلش این است که جاوااسکریپت این مقدار بدنام undefined را دارد که به شدت به این معنی نیست که متغیر تعریف نشده است، یا وجود ندارد undefined !== not defined

var a;
alert(typeof a); // undefined (declared without a value)
alert(typeof b); // undefined (not declared)

بنابراین هم یک متغیر که وجود دارد و هم متغیری دیگر که وجود ندارد میتواند نوع undefined را به شما گزارش دهد.

در مورد سوءتفاهم @Kevin، null == undefined. این به دلیل تبدیل نوع است و دلیل اصلی است که کرافورد همیشه به کسانی که در این مورد مطمئن نیستند توصیه میکند از عملگر برابری سخت === برای آزمایش مقادیر ممکن است نادرست استفاده کنند. null !== undefined به شما آنچه انتظار دارید را میدهد. لطفاً توجه داشته باشید که foo != null میتواند یک روش مؤثر برای بررسی این باشد که یک متغیر نه undefined و نه null است. البته میتوانید صریح باشید، زیرا ممکن است به خوانایی کمک کند.

اگر سوال را به چک کردن وجود یک شیء محدود کنید، typeof o == "object" ممکن است ایده خوبی باشد، مگر اینکه آرایهها را به عنوان شیء در نظر نگیرید، زیرا این کد نوع object را نیز گزارش میدهد که ممکن است کمی شما را گیج کند. نگوییم که typeof null هم object را به شما میدهد که کاملاً اشتباه است.

منطقهی اصلی که واقعاً باید در مورد typeof، undefined، null، unknown و دیگر اسرار محتاط باشید، اشیاء میزبان هستند. به آنها نمیتوان اعتماد کرد. آنها میتوانند تقریباً هر کار کثیفی که بخواهند انجام دهند. بنابراین مراقب آنها باشید و در صورت امکان عملکردشان را بررسی کنید، زیرا این تنها راه امن برای استفاده از ویژگیای است که ممکن است حتی وجود نداشته باشد.

پاسخ شماره ۳

دو روش:

نوع برای متغیرهای محلی

شما میتوانید با استفاده از typeof برای یک شیء محلی تست کنید:

if (typeof object !== "undefined") {}

پنجره برای متغیرهای سراسری

شما میتوانید یک شیء سراسری (یکی که در محدوده سراسری تعریف شده است) را با بررسی شیء window آزمایش کنید:

if (window.FormData) {}

پاسخ شماره ۴

شما میتوانید استفاده کنید:

if (typeof objectName == 'object') {
    //do something
}