بر

بررسی نوع در JavaScript

1 تمرین

درباره‌ی بررسی نوع

دانستن اینکه نوع یک تکه داده چیست، اغلب برای اجرای روان و بدون خطای کد بسیار مهم است.

JavaScript چندین روش برای بررسی نوع یک مقدار یا شیء دارد.

Note

سازوکارهای بررسی نوع در JavaScript می‌توانند تا حدودی غیرقابل‌اتکا باشند.

برای ایمنی نوع بهتر و نوع‌های قوی‌تر، احتمالاً بهتر است از TypeScript استفاده کنید؛ زبانی که بر پایه‌ی JavaScript ساخته شده است، اما با نحو نوع‌دهی یک زبان دارای نوع ایستا.

عملگر typeof

عملگر typeof نوع عملوند خود را برمی‌گرداند. خروجی یک رشته است که با نام یکی از انواع داده‌ی اولیه مطابقت دارد، به‌جز "null". همچنین می‌تواند "function" یا "object" باشد.

typeof undefined;
// => "undefined"

typeof true;
// => "boolean"

typeof 42;
// => "number"

typeof 'Hello, World!';
// => "string"

typeof function () {
  return 'Hello, World';
};
// => "function"

typeof [1, 2, 3, 4];
// => "object"

typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"

به [دلایل تاریخی][typeof null is "object"].

عملگر instanceof

برای بررسی نوع یک شیء می‌توانید از عملگر instanceof استفاده کنید. این عملگر بسته به اینکه عملوند دوم در زنجیره‌ی پروتوتایپ عملوند اول گنجانده شده باشد یا نه، به یک boolean ارزیابی می‌شود. برای روشن شدن مطلب، instanceof برمی‌گرداند که آیا عملوند اول نمونه‌ای از عملوند دوم یا یکی از کلاس‌های فرزند آن است یا نه. instanceof فقط روی اشیاء کار می‌کند.

class Beverage {
  // ...
}

// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
  // ...
}

const java = new Coffee();

java instanceof Coffee;
// => true

java instanceof Beverage;
// => true
Advanced

کلاس Array متدی به نام Array.isArray() دارد که بررسی می‌کند آیا آرگومانش یک آرایه است یا نه.

در حالی که instanceof Array با آرایه‌ای که در یک realm متفاوت ساخته شده باشد، مانند یک iframe در یک صفحه‌ی وب، کار نمی‌کند، Array.isArray() کار می‌کند.

دلیل این امر آن است که کلاس Array در هر realm سازنده‌ی متفاوتی دارد و هر iframe realm خودش را دارد؛ یعنی تابع موجود در زنجیره‌ی پروتوتایپ متفاوت خواهد بود و در نتیجه instanceof Array شکست می‌خورد. Array.isArray() می‌تواند این موضوع را نادیده بگیرد و باید هر جا ممکن بود از آن استفاده شود.

همچنین می‌تواند از مثبت‌های کاذب جان سالم به در ببرد، جایی که یک شیء در واقع یک Array نیست و فقط Array را در زنجیره‌ی پروتوتایپ خود دارد.

({ __proto__: Array.prototype }) instanceof Array
// => true

Array.isArray({ __proto__: Array.prototype })
// => false

عملگر in

عملگر in برمی‌گرداند که آیا عملوند اول ویژگی‌ای از عملوند دوم است یا نه. این عملگر بررسی نمی‌کند که آن ویژگی مقدار تعریف‌شده‌ای دارد یا نه. ویژگی‌ای که روی undefined تنظیم شده باشد، همچنان توسط in تشخیص داده می‌شود.

class Coffee {
  constructor() {
    this.temperature = 'hot';
    this.isDarkMatter = undefined;
  }

  coolDown() {
    this.temperature = 'warm';
  }
}

const espresso = new Coffee();

'temperature' in espresso;
// => true

'color' in espresso;
// => false

'isDarkMatter' in espresso;
// => true
Note

in برای ویژگی‌ها و متدهای ارث‌بری‌شده true برمی‌گرداند.

"coolDown" in espresso
// => true

"constructor" in espresso
// => true

برای جلوگیری از این کار، به‌جای آن از Object.hasOwn() استفاده کنید

تابع Object.hasOwn()

متد Object.hasOwn() برمی‌گرداند که آیا شیء مشخص‌شده صاحب ویژگی داده‌شده است یا نه (یعنی ارث‌بری نشده باشد یا متد نباشد).

class Coffee {
  constructor() {
    this.temperature = 'hot';
  }

  coolDown() {
    this.temperature = 'warm';
  }
}
const cappuccino = new Coffee();

Object.hasOwn(cappucino, 'temperature');
// => true

Object.hasOwn(cappucino, 'constructor');
// => false

Object.hasOwn(cappucino, 'coolDown');
// => false
ویرایش از طریق GitHub این پیوند در پنجره یا زبانه‌ی جدیدی باز می‌شود

بررسی نوع را یاد بگیرید