درک تایپ‌ها در جاوا‌ اسکریپت

05 آبان 1399, خواندن در 5 دقیقه

کلمه کلیدی typeof برای تعیین انواع داده‌ها استفاده می‌شود. این یکی از رایج‌ترین کلمات کلیدی جاوا اسکریپت است که در برنامه‌های JS یافت می‌شود. دانستن نوع داده‌هایی که روی آن‌ها کار می‌کنید، اغلب حیاتی به نظر می‌رسد. در این پست، ما به کلمه کلیدی typeof در جاوا اسکریپت‌ خواهیم پرداخت.

استفاده از typeof

انواع داده‌ها

داده‌ متغیری است که می‌خواهیم نوع آن را بدست آوریم. توجه داشته باشید که فقط پرانتز کلمه کلیدی typeof و به دنبال آن فاصله و متغیر وجود دارد.

// typeof.js
let num = 90
l(typeof num)

num یک عدد است بنابراین typeof یک رشته عدد را برمی‌گرداند:

number

بیایید نمونه‌های دیگر را ببینیم:

// typeof.js
const l = console.log
let str = "str"
let num = 90
let undef = undefined
let nul = null
let obj = { d: 90 }
let arr = [90]
function func() {}
let sym = Symbol("sym")
let bool = true
function showtype(data) {
 l(typeof data)
}
showtype(str)
showtype(num)
showtype(undef)
showtype(nul)
showtype(obj)
showtype(arr)
showtype(func)
showtype(bool)
showtype(sym)

خروجی:

$ node typeof
string
number
undefined
object
object
object
function
boolean
symbol

چه چیزی بر می‌گرداند

typeof کلمه کلیدی یکی از انواع داده‌های زیر را برمی‌گرداند:

  • string
  • number
  • undefined
  • object
  • function
  • boolean
  • symbol
  • Bigint

string: هر چیزی که بین "" باشد یک رشته در جاوا اسکریپت است:

let str = "str"

متغیر str یک نوع داده رشته‌ای است. بنابراین typeof str رشته را برمی‌گرداند.

number: این عدد 0 ~ 9 را نشان می‌دهد. typeof در مقابل Number نوع "number" را برمی‌گرداند.

le num = 90
l(typeof num)

خروجی:

$ node typeof
number

NaN همچنین برخلاف معنای آن عدد را برمی‌گرداند NaN => نه عدد نیست.

let nan = NaN
l(typeof nan)

خروجی:

$ node typeof
number

این بسیار گیج کننده است، مقداری که "عدد نیست" چگونه می تواند برای یک عدد قابل اثبات باشد؟ برای بررسی NaN، بدیهی است که نمی‌توانیم از کلمه کلیدی typeof استفاده کنیم، از تابع isNaN استفاده خواهیم کرد.

let nan = NaN
l(typeof nan)
l(isNaN(nan))

خروجی:

number
true

undefined این زمانی بر می‌گردد که یک متغیر هنوز مقدار‌دهی نشده یا صریحاً یک مجموعه تعریف نشده داشته باشد.

let undef
l(undef)
let undef1 = undefined
l(undef1)

وقتی typeof در مقابل یک متغیر تعریف نشده قرار می‌گیرد، "undefined" را برمی‌گرداند:

let undef
l(under)
let undef1 = undefined
l(undef1)
l(typeof undef)
l(typeof undef1)

خروجی:

$ node typeof
undefined
undefined

این خوب است، بنابراین می‌توانیم با استفاده از کلمه کلیدی typeof مقادیر تعریف نشده را بررسی کنیم.

آبجکت: این کمی مشکل است. بسیاری از انواع متغیرها آبجکت را برمی‌گردانند.

let nul = null
let obj = { d: 90 }
let arr = [90]
l(typeof nul)
l(typeof obj)
l(typeof arr)

خروجی:

$ node typeof
object
object
object

می‌توانیم ببینیم که همه آن‌ها آبجکت را به صورت نوع برمی‌گردانند. با این کار، نمی‌توانیم null و array را با عملگر typeof تست کنیم.

اما null یک آبجکت است، این گیج کننده است. تاریخ به ما گفت که این یک اشکال رفع نشده در جاوا اسکریپت بود و تا به امروز ما را آزار داده است. اکنون با رفع اشکال، میلیارد‌ها کد و برنامه جاوا‌اسکرپیت خراب می‌شوند. بنابراین ما باید با آن زندگی کنیم.

برای بررسی null، ما از برابری تساوی و یا از برابری دقیق استفاده خواهیم کرد، که در هر دو به درستی تبدیل می‌رسیم:

let nul = null
l(nul == null)
l(nul === null)

خروجی:

true
true

تابع: توابع در حالت type به "function" تبدیل می‌شوند. خیلی راحت توابع منظم، توابع پیکان همه "function" را تعیین می‌کنند.

function func() {}
const arrFunc = () => {}
l(typeof func)
l(typeof arrFunc)

خروجی:

$ node typeof
function
function

boolean :دو مقدار درست یا نادرست دارد. این‌ها نوع boolean را برمی‌گردانند.

let bool = true
l(bool)

خروجی:

$ node typeof
boolean

بنابراین ، بررسی boolean کاملاً آسان است. همه مقادیر موجود در جاوا اسکریپت واقعی هستند به جز مقادیر جعلی. مقادیر جعلی عبارتند از:

  • 0
  • “” (Empty string)
  • NaN
  • false
  • null
  • undefined

symbol: این برای ایجاد نام‌های یونیک در جاوا اسکرپیت استفاده می‌شود. آن‌ها بیشتر در ایجاد کلید در اشیا استفاده می‌شوند. این‌ها رشته "symbol" را برمی‌گردانند.

let sym = Symbol("sym")
l(typeof sym)

خروجی:

$ node typeof
symbol

Bigint

BigInt یک شی built-in است که اعداد بین دامنه 2⁵³ تا 1 را نشان می‌دهد. برای ایجاد یک نوع متغیر bigint ، n را به انتهای یک عدد صحیح اضافه می‌کنیم. وقتی متغیر BigInt در برابر typeof استفاده شود، bigint بر‌ می‌گردد:

let bigint = 90n
l(typeof bigint)

خروجی:

$ node typeof
bigint

نوع و بسته بندی توابع

استفاده از boolean جدید، رشته جدید و… نتیجه نوع را بر روی آن‌ها می‌شکند.

اگر این کار را انجام دهم:

let bool = new Boolean(true)

دیگر درست برنمی‌گردد، هنگامی که نوع آن با typeof بررسی شود، یک آبجکت را برمی‌گرداند

let bool = new Boolean(true)
l(typeof bool)

خروجی:

$ node typeof
object

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

let str = "str"
let num = 90

اما اگر این کار را به صورت زیر انجام دهیم:

str.length

ما در حال دسترسی به یک ویژگی ابتدایی هستیم، نباید اینطور باشد اما با این حال یک نتیجه داریم:

3

رشته جاوا اسکریپت ابتدا object و سپس ویژگی طول به آن بازیابی می‌شود. با بازگشت نتیجه، Str دوباره بدوی می‌شود.

در ویژگی str.length جاوا اسکرپیت این کار را انجام داد:

l(new String("str").length)

قبل از دسترسی به ویژگی length، آن را در رشته جدید قرار داد.

نوع و آبجکت‌ها

همانطور که در بالا آرایه‌ها دیدیم، null ، object ، NaN همه "object" را برمی‌گردانند. مفاهیم دیگر ، RegExp هم "object" را برمی‌گردانند. بنابراین ما نمی‌توانیم Array یا هر یک از آن‌ها را با استفاده از typeof تست کنیم.

Array دارای isArray است که به درستی تعیین می‌کند یک داده Array است یا نه.

برای بررسی null می توانید

isNull === null

یا

!isNull && typeof isNull == "object"

برای nan از isNaN استفاده کنید

برای تاریخ، از تایپduck  استفاده کنید:

typeof date.getMonth === "function"

یا می توانید از instanceof استفاده کنید اما برای تاریخ‌ها نامعتبر برمی‌گردد.

اگر تابحال از دوره‌های جاوا اسکریپت راکت استفاده نکردید؛ کلیک کنید.

نتیجه

typeof در بررسی نوع ابزاری قدرتمند و هم نامشخص است. این در هنگام برخورد با انواع null ، NaN ، object ، آرایه و غیره یک نوع رفتار را دارد. با این حال، برای برخی از انواع ابتدایی مفید است: number، bigint ، symbol، undefined، string، boolean.

منبع

چه امتیازی به این مقاله می دید؟
خیلی بد
بد
متوسط
خوب
عالی

دیدگاه‌ها و پرسش‌ها

برای ارسال دیدگاه لازم است، ابتدا وارد سایت شوید.

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

در حال دریافت نظرات از سرور، لطفا منتظر بمانید

آفلاین
user-avatar
محمدرضا مصلی @mohamadresaaa
حدود ۶ سالی هست که دارم برنامه نویسی میکنم و به دلیل علاقه زیادی که به زبان جاوا اسکریپت داشتم، به سمت تکنولوژی nodejs و فریم ورک های آن رفتم و همچنان...
دنبال کردن

گفتگو‌ برنامه نویسان

بخشی برای حل مشکلات برنامه‌نویسی و مباحث پیرامون آن وارد شو