پرش به محتویات

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

یک مقدار توی جاوااسکریپت همیشه از یک تایپ خاص هست به عنوان مثال رشته یا یک عدد

در جاوااسکریپت هشت تایپ داده اصلی وجود داره، اینجا ما به طور کلی به آنها خواهیم پرداخت و در فصل های بعدی به طور مفصل در مورد هر یک صحبت خواهیم کرد.

ما میتونیم هر تایپ رو توی یک متغیر قرار بدیم، به عنوان مثال یک متغیر میتونه اول یک رشته باشه و بعد یک عدد رو ذخیره کنه

// no erorr
let message = "hello";
message = 123456;

زبان های برنامه‌نویسی که اجازه این کار و به ما میدن مثل جاوااسکریپت «تایپ پویا» میگن بهشون به این معنی که انواع دیتا تایپ‌ها وجود دارن اما متغیر‌ها به هیچ کدوم از اونا محدود نیستن.

عدد(Number)

let n = 123;
n = 12.345;

تایپ عدد هر دو مقدار عدد صحیح و اعشاری رو نشون میده

عملگر های زیاید برای کار با عدد وجود داره مثل ضرب * ،تقسیم / ،جمع +،تفریق − و غیره ...

علاوه بر عدد های عادی، به اصطلاح «مقادیر ویژه عددی» وجود دارد که متعلق به این دیتا تایپ عدد هستن:

Infinity , -Infinity, NaN

بی‌نهایت (Infinity) نشان دهنده Infinity ∞ ریاضی هست این مقدار خاص هست که از هر عددی بیشتره

می‌تونیم اونو در نتیجه تقسیم بر صفر بدست بیاریم:

alert( 1 / 0 ); // Infinity

یا فقط مستقیم بهش اشاره کنیم:‌

alert( Infinity ); // Infinity

مقدار (NaN) نشان دهنده یک خطای محاسباتی هست، این یک نتیجه از عملیات ریاضی نادرست یا تعریف نشده هست به عنوان مثال:‌

alert( "not a number" / 2 ); // NaN, such division is erroneous

هر عملی بر روی NaN نتیجه NaN خواهد داشت :

alert( "not a number" / 2 + 5 ); // NaN

در نتیجه اگر NaN توی عملیات ریاضیاتی‌ای وجود داشته باشه، بر روی تمام معادله تاثیر میذاره (نتیجه معادله برابر NaN خواهد بود)

عملیات ریاضی در جاوا اسکریپت امن هست ما هر نوع عملی میتونیم انجام بدیم مثل تقسیم بر صفر. اسکریپت ما هیچ‌وقت با خطا مواجه نخواهد شد. در بدترین حالت NaN را به عنوان نتیجه خواهیم گرفت

اعداد بزرگ (BigInt)

توی جاوااسکریپت تایپ Number نمیتونه اعداد بزرگ‌تر از (۱ - ۵۳^۲ ) یعنی (9007199254740991) رو نشون بده و کمتر از (۱−۵۳^۲)− برای اعداد منفی

برای بیشتر اهداف که کاملا به اندازه کافی هست، اما گاهی اوقات ما نیاز اعداد واقعا بزرگ داریم، به عنوان مثال، برای رمزنگاری یا زمان سنج با دقت میکرو ثانیه

تایپ BigInt اخیرا به زبان اضافه شده تا اعداد صحیح با طول دلخواه رو نشون بده

یک مقدار BigInt با اضافه کردن حرف n به اخر یک عدد صحیح ایجاد میشه

// the "n" at the end means it's a BigInt
const bigInt = 1234567890123456789012345678901234567890n;

از اونجایی که BigInt به ندرت استفاده میشه اینجا اون رو توضیح نمیدیم اما یک فصل جداگانه رو بهش اختصاص دادیم وقتی به چنین اعداد بزرگی احتیاج دارین اونجا رو بخونین (توی قسمت های بعدی قرار میدم براتون)

مشکلات سازگاری

در حال حاضر BigInt توسط مرورگر های FireFox/Chrome/Edge/Safari پشتیبانی میشه و همون طور که میتونین حدس بزنین مرورگر IE پشتیبانیش نمیکنه

توی این لینک هم میتونین چک کنین که دقیقا روی چه ورژن هایی از مرورگر ها پشتیبانی میشه

رشته(String)

یه رشته توی جاوااسکریپت باید بین دو تا کوتِیشِن باشه

let str = "Hello";
let str2 = 'Single quotes are ok too';
let phrase = `can embed another ${str}`;

توی جاوا اسکریپت سه نوع کوتِیشِن داریم :

  • Double qoutes مانند "Hello".
  • Single qoutes مانند 'Hello'.
  • Backticks مانند `Hello`.

دابل و سینگل‌ کوتِیشِن ساده هستن و فرقی ندارن با هم دیگه توی جاوااسکریپت

بک‌تیک توسعه یافته ساختار کوتِیشِن هست، به ما این اجازه رو میده تا متغیر و یا یه سری عملیات‌ها رو با قرار دادن اونا در {...}$ توی یک رشته قرار بدیم، به عنوان مثال:‌

let name = "John";

// embed a variable
alert( `Hello, ${name}!` ); // Hello, John!

// embed an expression
alert( `the result is ${1 + 2}` ); // the result is 3

عبارت داخل {...}$ محاسبه میشه و نتیجه‌اش به بخشی از رشته تبدیل میشه ما میتونیم هر چیزی رو توش قرار بدیم مثل متغیر یا یک عبارت مثل ۱ + ۲ یا یه چیز پیچیده تر

لطفا توجه کنین این قابلیت فقط زمانی هست که از بک‌تیک استفاده کنین توی دابل و سینگل کوتِیشِن این قابلیت وجود نداره

alert( "the result is ${1 + 2}" ); // the result is ${1 + 2} (double quotes do nothing)

در مورد رشته‌ها توی آموزش های بعدی بیشتر توضیح میدیم

تایپ کارکتری وجود نداره در برخی زبان‌ها یه تایپ خاص به اسم «character» وجود داره که برای یک کاراکتر هست. به عنوان مثال در زبان برنامه‌نویسی C و Java این نوع «char» نام گذاری شده

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

تایپ منطقی‌(Boolean)

تایپ منطقی فقط دو تا مقدار True و False داره این تایپ معمولا برای نگهداری مقدار های بله/خیر استفاده میشه، true یعنی «بله،‌درست» و false یعنی «نه، نادرست»

برای نمونه :

let nameFieldChecked = true; // yes, name field is checked
let ageFieldChecked = false; // no, age field is not checked

مقدار های منطقی همچنین میتونین از نتیجه یک مقایسه هم باشن:

let isGreater = 4 > 1;
alert( isGreater ); // true (the comparison result is "yes")

که مثال بالا یعنی ۴ بزرگتر از ۱ هست؟ و جوابش میشه «بله» یا همون true

در مورد Boolean ها در بخش‌های بعدی صحبت خواهیم کرد.

مقدار null

مقدار null به هیچ کدوم از دیتا تایپ هایی که بالا گفتیم ربطی نداره

این یک تایپ جداگانه هست که فقط شامل مقدار null هست :

let age = null;

در جاوااسکریپت مثل بعضی از زبان های برنامه نویسی null به هیچ آبجکتی اشاره نمیکنه یا اشاره‌گر به null نیست

فقط یه مقدار خاص هست که نشون‌دهنده «هیچی» ، «خالی» و یا «مقدار ناشناخته» هست کد بالا یعنی مقدار سن ناشناخته هست

مقدار undefined

مقدار undefined هم مثل null جدا از بقیه هست و ربطی نداره به هیچ تایپی

معنی undefined یعنی «مقداری هنوز اختصاص داده نشده» اگه یک متغیر تعریف بشه اما مقداردهی نشه اون موقع مقدارش undefined هست

let age;

alert(age); // shows "undefined"

از نظر فنی میشه به یک متغیر مقدار undefined رو اختصاص داد :

let age = 100;

// change the value to undefined
age = undefined;

alert(age); // "undefined"

اما ما این کار رو توصیه نمی‌کنیم و برای تخصیص مقدار "خالی" یا "ناشناخته" از null استفاده می‌کنیم و از undefined برای بررسی اینکه به متغیری مقدار تخصیص یافته یا خیر استفاده می‌کنیم

تایپ Objects و Symbols

تایپ object یک تایپ خاص هست

به تایپ های دیگه میگن تایپ اولیه چون که مقدار اونا فقط میتونه یه چیز باشه (مثل رشته، عدد یا بقیه چیزا) در مقابل object ها برای ذخیره مجموعه‌ای از داده ها و موجودیت های پیچیده‌تر استفاده می‌شن بعد از اینکه در مورد تایپ های اولیه بیشتر مطالعه کردیم، در مورد object ها بیشتر خواهیم آموخت

نوع symbol برای ایجاد یک شناسه منحصر به فرد برای object ها مورد استفاده قرار میگیره. برای تکمیل عنوان این بخش این نوع داده را نیز در اینجا گفتیم ولی بهتره جزئیات اون رو در بخش‌های بعدی بررسی کنیم

عملگر typeof

عملگر typeof تایپ یک مقدار رو برمیگردونه و این خیلی به درد میخوره وقتی که ما میخوایم روی مقدارهایی با تایپ های مختلف عملیات خاصی انجام بدیم یا این که فقط بخوایم چک کنیم که تایپ فلان مقدار چیه

به دو صورت میتونیم ازش استفاده کنیم: ۱. به صورت عملگر : typeof x ۲. به صورت فانکشن: typeof(x)

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

وقتی که typeof x رو استفاده میکنم نتیجه‌اش یه رشته هست که تایپ مقدار x رو برامون برمیگردونه

typeof undefined // "undefined"

typeof 0 // "number"

typeof 10n // "bigint"

typeof true // "boolean"

typeof "foo" // "string"

typeof Symbol("id") // "symbol"

typeof Math // "object"  (1)

typeof null // "object"  (2)

typeof alert // "function"  (3)

سه خط آخر ممکنه نیاز به توضیحات اضافی داشته باشند:

  1. آبجکت Math اصطلاحا built-in (از پیش نوشته شده در هسته زبان) هست که عملیات متنوع ریاضیاتی در اختیار ما قرار میده. در اینجا صرفا یک مثال از اون رو نمایش دادیم و در بخش Numbers با اون بیشتر آشنا خواهیم شد

  2. خروجی typeof null همونطور که می‌بینید "object" هست و این صحیح نیست. این یک خطا در نوع کار typeof هست که به منظور سازگاری باقی مونده مطمئنا null یک object نیست. خودِ null یکی از انواع داده در جاوا اسکریپته

  3. تایپ alert یک فانکشن هست چرا که alert یکی از فانکشن‌های جاوا اسکریپت هست ما در بخش‌های بعدی با فانکشن‌ها بیشتر آشنا میشیم و خواهیم آموخت که نوعی تحت عنوان فانکشن نداریم و خودِ فانکشن‌ها در اصل از نوعِ object هستن اما عملگر typeof با اونا به طرز دیگه‌ای برخورد می‌کنه

خلاصه

۸ تا تایپ ابتدایی توی جاوااسکریپت وجود داره

  • اعداد(number) برای هر نوع عددی استفاده میشه صحیح، اعشاری

  • اعداد بزرگ(bigint) برای اعداد صحیح با طول دلخواه استفاده میشه

  • رشته(string) برای مقدار های رشته‌ای استفاده میشه یک رشته میتونه خالی باشه یا یک کاراکتر داشته باشه یا بیشتر از یک کاراکتر، تایپ جداگانه‌ای برای کاراکتر وجود نداره

  • مقدار منطقی(boolean) برای صحیح/غلط یا همون True , False

  • مقدار null برای مقدار های ناشناخته - خودش یه تایپ هست و به بقیه تایپ ها ربطی نداره

  • مقدار undefined برای مقدار های اختصاص داده نشده - این هم خودش یه تایپه و بقیه تایپ ها ربطی نداره

  • مقدار obejct برای ساختمان داده های پیچیده‌تر

  • مقدار symbol برای شناسه های یکتا

  • عملگر typeof به ما این اجازه رو میده تا ببینیم توی متغیر چه نوع داده‌ای ذخیره شده

  • دو نوع میشه ازش استفاده کرد :typeof x یا typeof(x)
  • یک رشته برمیگردونه که اسم تایپ اون مقدار هست مثل "string"
  • برای null مقدار "object" رو برمیگردونه - این یه ارور توی زبان هست و واقعا اینجوری نیست و آبجکت نیست