دیتا تایپ در جاوااسکریپت
یک مقدار توی جاوااسکریپت همیشه از یک تایپ خاص هست به عنوان مثال رشته یا یک عدد
در جاوااسکریپت هشت تایپ داده اصلی وجود داره، اینجا ما به طور کلی به آنها خواهیم پرداخت و در فصل های بعدی به طور مفصل در مورد هر یک صحبت خواهیم کرد.
ما میتونیم هر تایپ رو توی یک متغیر قرار بدیم، به عنوان مثال یک متغیر میتونه اول یک رشته باشه و بعد یک عدد رو ذخیره کنه
// 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)
سه خط آخر ممکنه نیاز به توضیحات اضافی داشته باشند:
-
آبجکت
Math
اصطلاحاbuilt-in
(از پیش نوشته شده در هسته زبان) هست که عملیات متنوع ریاضیاتی در اختیار ما قرار میده. در اینجا صرفا یک مثال از اون رو نمایش دادیم و در بخش Numbers با اون بیشتر آشنا خواهیم شد -
خروجی
typeof null
همونطور که میبینید"object"
هست و این صحیح نیست. این یک خطا در نوع کارtypeof
هست که به منظور سازگاری باقی مونده مطمئناnull
یکobject
نیست. خودِnull
یکی از انواع داده در جاوا اسکریپته -
تایپ
alert
یک فانکشن هست چرا که alert یکی از فانکشنهای جاوا اسکریپت هست ما در بخشهای بعدی با فانکشنها بیشتر آشنا میشیم و خواهیم آموخت که نوعی تحت عنوان فانکشن نداریم و خودِ فانکشنها در اصل از نوعِ object هستن اما عملگرtypeof
با اونا به طرز دیگهای برخورد میکنه
خلاصه
۸ تا تایپ ابتدایی توی جاوااسکریپت وجود داره
-
اعداد(
number
) برای هر نوع عددی استفاده میشه صحیح، اعشاری -
اعداد بزرگ(
bigint
) برای اعداد صحیح با طول دلخواه استفاده میشه -
رشته(
string
) برای مقدار های رشتهای استفاده میشه یک رشته میتونه خالی باشه یا یک کاراکتر داشته باشه یا بیشتر از یک کاراکتر، تایپ جداگانهای برای کاراکتر وجود نداره -
مقدار منطقی(
boolean
) برای صحیح/غلط یا همونTrue
,False
-
مقدار
null
برای مقدار های ناشناخته - خودش یه تایپ هست و به بقیه تایپ ها ربطی نداره -
مقدار
undefined
برای مقدار های اختصاص داده نشده - این هم خودش یه تایپه و بقیه تایپ ها ربطی نداره -
مقدار
obejct
برای ساختمان داده های پیچیدهتر -
مقدار
symbol
برای شناسه های یکتا -
عملگر typeof به ما این اجازه رو میده تا ببینیم توی متغیر چه نوع دادهای ذخیره شده
- دو نوع میشه ازش استفاده کرد :
typeof x
یاtypeof(x)
- یک رشته برمیگردونه که اسم تایپ اون مقدار هست مثل
"string"
- برای
null
مقدار"object"
رو برمیگردونه - این یه ارور توی زبان هست و واقعا اینجوری نیست و آبجکت نیست