از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
جاوا اسکریپت: بررسی کنید که آیا متغیر تعریف نشده یا تهی تعریف نشده است و مقادیر تهی همیشه به صورت مخفیانه وارد جریان کد می شوند. چه ما یک مرجع را از طریق عوارض جانبی از دست دهیم، فراموش کنیم یک متغیر مرجع را به یک شی در حافظه اختصاص دهیم، یا یک پاسخ خالی از یک منبع، پایگاه داده یا API دیگر دریافت کنیم – باید با موارد تعریف نشده مقابله کنیم…
سرفصلهای مطلب
معرفی
undefined
و null
مقادیر همیشه به صورت مخفیانه وارد جریان کد می شوند. چه ما یک مرجع را از طریق عوارض جانبی از دست دهیم، فراموش کنیم یک متغیر مرجع را به یک شی در حافظه اختصاص دهیم، یا یک پاسخ خالی از یک منبع، پایگاه داده یا API دیگر دریافت کنیم – باید با آن مقابله کنیم. undefined
و null
همیشه ارزش دارد
در این راهنمای کوتاه، ما نگاهی به چگونگی بررسی اینکه آیا یک متغیر است یا خیر، خواهیم داشت
undefined
یاnull
در جاوا اسکریپت
تفاوت بین تعریف نشده و خالی
undefined
و null
متغیرها اغلب دست به دست هم می دهند و برخی از این اصطلاحات به جای یکدیگر استفاده می کنند. اگرچه بین آنها تفاوت وجود دارد:
- تعریف نشده متغیری است که به چیزی اشاره دارد که وجود ندارد، و متغیر به عنوان چیزی تعریف نشده است.
- خالی متغیری است که است تعریف شده است اما یک مقدار را از دست داده است.
تفاوت بین این دو شاید از طریق کد کمی واضح تر باشد:
let a;
console.log(a); // undefined
let b = null;
console.log(b); // null
a
تعریف نشده است – به هیچ چیز اختصاص داده نمی شود، و هیچ تعریف روشنی در مورد اینکه واقعا چیست وجود ندارد. b
است تعریف شده است به عنوان یک مقدار صفر.
چه b
مستقیماً به عنوان تعریف شد null
یا به عنوان مقدار برگشتی یک تابع تعریف می شود (که فقط a را برمی گرداند null
ارزش) مهم نیست – این است تعریف شده است مانند چیزی.
از سوی دیگر، a
کاملا به معنای واقعی کلمه است هیچ چی. هیچ تکلیفی انجام نشد و کاملاً مشخص نیست که چه چیزی باید باشد یا می تواند باشد.
در عمل، بسیاری از null
و undefined
مقادیر از خطای انسانی در حین برنامه نویسی ناشی می شوند و این دو در بیشتر موارد با هم هستند. هنگام بررسی یکی – ما معمولاً دیگری را نیز بررسی می کنیم.
بررسی کنید که آیا متغیر است یا خیر تعریف نشده یا خالی
دو رویکرد وجود دارد که می توانید هنگام بررسی اینکه آیا یک متغیر است یا خیر، انتخاب کنید undefined
یا null
در جاوا اسکریپت وانیلی
== و === اپراتورها
تفاوت وجود دارد بین اپراتور برابری سست (==
) و اپراتور برابری دقیق (===
) در جاوا اسکریپت. از دست دادن برابری ممکن است منجر به نتایج غیرمنتظره می شود و در این زمینه متفاوت از عملگر برابری دقیق رفتار می کند:
console.log(null == undefined); // true
console.log(null === undefined); // false
توجه داشته باشید: این را نباید به عنوان اثبات که null
و undefined
همان هستند. این عملگر برابری شل از تعاریف “محاوره ای” ارزش های صدق/کاذب استفاده می کند. 0
، ""
و ()
به عنوان ارزیابی می شوند false
همانطور که آنها کمبود داده را نشان می دهند، حتی اگر آنها در واقع برابر با یک بولی نیستند.
که گفته شد – از آنجایی که عملگر برابری سست رفتار می کند null
و undefined
به عنوان یکسان – می توانید از آن به عنوان استفاده کنید کوتاه نویسی نسخه بررسی برای هر دو:
// Undefined variable
let a;
if (a == null) {
console.log('Null or undefined value!');
} else {
console.log(a);
}
این بررسی می کند که آیا a
است یا null
یا undefined
. از آنجا که a
است undefined
، این نتیجه می شود:
Null or undefined value!
اگرچه، ما واقعاً نمی دانیم کدام یک از این موارد است. اگر بخواهیم از عملگر سخت استفاده کنیم، که اگر را بررسی می کند a
است null
، اگر با یک مواجه شویم به طرز ناخوشایندی شگفت زده خواهیم شد undefined
ارزش در console.log()
بیانیه:
let a;
if (a === null) {
console.log('Null or undefined value!');
} else {
console.log(a); // undefined
}
a
واقعا نیست null
، اما آن است undefined
. در این مورد، ما می خواهیم آنها را به طور جداگانه بررسی کنیم، اما انعطاف پذیری لازم برای دانستن دلیل واقعی جریان را داشته باشیم:
let a;
if (a === null || a === undefined) { // true
console.log('Null or undefined value!');
} else {
console.log(a);
}
در اینجا، ما آنها را با یک OR انحصاری ترکیب کردهایم – اگر چه اگر بخواهید میتوانید آنها را برای عملیات بازیابی مختلف از هم جدا کنید:
let a;
if (a === null) {
console.log('Null value!');
} else if (a === undefined) { // true
console.log('Undefined value!');
}
توجه داشته باشید: شایان ذکر است که اگر مرجع وجود نداشته باشد، الف ReferenceError
پرتاب خواهد شد. با استفاده از این می توان از این امر جلوگیری کرد typeof
اپراتور، اگرچه ممکن است از منظر طراحی کد بهترین انتخاب نباشد. اگر از a استفاده می کنید موجود نیست متغیر مرجع – بی سر و صدا آن مسئله را با استفاده از آن نادیده می گیرد typeof
ممکن است منجر به شکست بی سر و صدا شود.
نوع اپراتور
این typeof
اپراتور علاوه بر این می تواند در کنار ===
عملگر برای بررسی اینکه آیا نوع یک متغیر برابر است یا خیر 'undefined'
یا 'null'
:
let a;
if (typeof a === 'undefined') {
console.log('Undefined variable');
} else if (typeof a === 'null') {
console.log('Null-value');
}
این نتیجه در:
Undefined variable
با این حال، شایان ذکر است که اگر شما را در یک موجود نیست متغیر مرجع – typeof
خوشحال است که با آن کار می کند و با آن رفتار می کند undefined
:
if (typeof someVar === 'undefined') {
console.log('Undefined variable');
} else if (typeof someVar === 'null') {
console.log('Null-value');
}
این کد همچنین نتیجه می دهد:
Undefined variable
از نظر فنی، some_var
است یک متغیر تعریف نشده، زیرا هیچ تخصیصی ندارد. از سوی دیگر، این می تواند typeof
بی سر و صدا شکست می خورد و سیگنال می دهد که ورودی مقدار ممکن است مشکل داشته باشد، به جای اینکه خطایی ایجاد کند که مشخص می کند با یک متغیر غیر موجود سروکار دارید.
به عنوان مثال – تصور کنید اشتباه تایپی کرده اید و به طور تصادفی وارد شده اید somevariable
بجای someVariable
در if
عبارت:
let someVariable = 'Hello!'
if (typeof somevariable === 'undefined') {
console.log('Undefined variable');
} else if (typeof somevariable === 'null') {
console.log('Null-value');
} else {
console.log(somevariable);
}
در اینجا، ما سعی می کنیم بررسی کنیم که آیا someVariable
است null
یا undefined
، و این نیست. با این حال، به دلیل اشتباه تایپی، somevariable
در عوض بررسی می شود و نتیجه این است:
Undefined variable
در یک سناریوی پیچیده تر – ممکن است تشخیص این اشتباه تایپی سخت تر از این باشد. ما یک شکست خاموش داشته ایم و ممکن است وقت بگذاریم روی دنباله ای دروغین از سوی دیگر، فقط با استفاده از ==
و ===
اپراتورهای اینجا به ما در مورد متغیر مرجع غیر موجود هشدار داده بودند:
let someVariable = 'Hello!'
if (somevariable === 'undefined') {
console.log('Undefined variable');
} else if (somevariable === 'null') {
console.log('Null-value');
} else {
console.log(somevariable);
}
این کد نتیجه می دهد:
error: Uncaught ReferenceError: somevariable is not defined
توجه داشته باشید: این به این معنی نیست typeof
ذاتاً انتخاب بدی است – اما این مفهوم را نیز به دنبال دارد.
استفاده از Lodash برای بررسی اینکه آیا متغیر است یا خیر خالی، تعریف نشده یا صفر
در نهایت – می توانید کتابخانه های خارجی را علاوه بر اپراتورهای داخلی انتخاب کنید. در حالی که وارد کردن یک کتابخانه خارجی موجه نیست فقط برای انجام این بررسی – در این صورت، بهتر است فقط از اپراتورها استفاده کنید.
با این حال، Lodash در حال حاضر در بسیاری از پروژه ها حضور دارد – این یک کتابخانه پر استفاده است، و زمانی که در حال حاضر وجود داشته باشد، با استفاده از چند روشی که ارائه می دهد، کارایی کاهش نمی یابد. مهمتر از همه، Lodash چندین روش مفید ارائه می دهد که بررسی می کند که آیا یک متغیر وجود دارد یا خیر خالی، تعریف نشده یا صفر.
Lodash را نصب و وارد کنید
تو می توانی import Lodash از طریق CDN:
https://cdn.jsdelivr.net/npm/(email protected)/lodash.min.js
آن را به صورت محلی از a وارد کنید .js
فایل:
<script src="lodash.js"></script>
یا از طریق NPM نصب کنید:
$ npm install lodash
علاوه بر این، می توان آن را به عنوان یک ماژول ES6 وارد کرد یا از طریق آن وارد کرد require()
نحو:
import _ from 'lodash';
// OR
const _ = require('lodash');
توجه داشته باشید: نامگذاری نمونه Lodash یک قرارداد است _
، با نام ضمنی، لازم نیست.
اکنون میتوانیم از کتابخانه برای بررسی اینکه آیا یک متغیر وجود دارد یا خیر استفاده کنیم null
، undefined
یا صفر – جایی که صفر اشاره به هر دو مصیبت قبلی است. می توان از آن به عنوان نسخه مختصر برای بررسی هر دو استفاده کرد:
let a = null;
console.log(_.isNull(a)); // true
console.log(_.isUndefined(a)); // false
console.log(_.isNil(a)); // true
نتیجه
در این راهنمای کوتاه، ما نگاهی به روش بررسی اینکه آیا یک متغیر تهی، تعریف نشده یا صفر در جاوا اسکریپت با استفاده از ==
، ===
و typeof
اپراتورها، به مزایا و معایب هر رویکرد اشاره می کنند. در نهایت، ما نگاهی گذرا به استفاده از Lodash انداختهایم – یک کتابخانه ابزاری محبوب برای انجام همان بررسیها.
منتشر شده در 1403-01-14 07:19:03