آشنایی با آرایه ها
در فصل قبل با انواع دادهی اولیه (Primitive Data Types) در جاوا اسکریپت آشنا شدیم. همچنین دیدیم که نوع دادهی دیگری نیز در جاوا اسکریپت وجود دارد که نوع Object یا شئ است. اما نوع Object خود دارای انواع گوناگونی است. در جاوا اسکریپت تعدادی نوع دادهی پیشساخته (Built-in) وجود دارد که از نوع Object هستند. همچنین در فصل پنجم خواهیم دید که در جاوا اسکریپت امکان ایجاد انواع دادهی جدید از نوع Object وجود دارد.
در این فصل قصد داریم با چند مورد از این انواع پیشساخته در جاوا اسکریپت آشنا شویم. این موارد عبارتند از : آرایه (Array)، مجموعه (Set) و نقشه (Map).آرایهها (Arrays)
آرایهها یکی از مهمترین و پر کاربردترین انواع داده در اکثر زبانهای برنامهنویسی هستند. یک آرایه حاوی لیستی از دادههای به هم مرتبط است که هر یک از دادهها دارای یک شاخص یا اندیس (index) است. آرایهها را به دو روش میتوان در جاوا اسکریپت تعریف کرد. روش اول که مرسومتر و سادهتر است را در قطعه کد زیر میبینید.
let newArray = [value1 , value2 , value3 , ...];
در قطعه کد فوق، یک متغیر از نوع آرایه به نام newArray تعریف شده است. همانطور که میبینید برای تعیین دادههای این آرایه از علامت "[ ]" استفاده شده است. داخل این علامت میتوان به تعداد دلخواه دادههای مختلف از انواع مختلف را قرار داد که این دادهها باید با کاما "," از هم جدا شوند.
روش دوم تعریف یک آرایه، استفاده از تابع سازندهی Array است. نحوهی تعریف یک آرایه با این روش را در قطعه کد زیر میبینید.
let newArray = new Array(value1 , value2 , value3 , ...);
آرایهی ایجاد شده با دستور فوق، کاملاً معادل آرایهی قبلی است و هیچ تفاوتی بین این دو روش وجود ندارد. اما معمولاً برنامهنویسان روش اول را به دلیل سادگی آن ترجیح میدهند. پس از تعریف یک آرایهی جدید میتوان مقادیر داخل آن را تغییر داد یا مقادیر جدیدی را اضافه کرد و یا مقادیر موجود را حذف کرد. در نتیجه میتوان در زمان تعریف یک آرایه هیچ مقداری را داخل آن قرار نداد و مقادیر آن را در زمان مناسب به آن اضافه کرد. برای تعریف آرایهای که هیچ مقدار اولیهای ندارد، میتوان از یکی از دستورات زیر استفاده کرد.
let newArray = [ ];
و یا
let newArray = new Array();
همانطور که اشاره شد آرایهها نوعی Object هستند. در نتیجه استفاده از عملگر typeof بر روی آرایهها مقدار "object" را برمیگرداند.
typeof newArray;
← "object"
برای شروع، آرایهی سادهی زیر را در نظر بگیرید.
let fruits = ['Apple' , 'Orange' , 'Banana'];
حال برای دسترسی به هر یک از دادههای این آرایه که همگی از نوع رشته هستند، میتوان از اندیس عنصر مورد نظر استفاده کرد. توجه کنید که در جاوا اسکریپت اندیس آرایهها از صفر شروع میشود. بنابراین برای دسترسی به عنصر اول آرایه باید از اندیس صفر استفاده کرد. به قطعه کد زیر و خروجیهای آن توجه کنید.
fruits[0];
← "Apple"
fruits[2];
← "Banana"
fruits[3];
← undefined
همانطور که مشاهده میکنید، در صورت استفاده از اندیسی که در آرایه وجود ندارد، مقدار undefined برگردانده میشود. همچنین پس تعریف یک آرایه میتوان تعداد، نوع و مقدار دادههای آن را تغییر داد. مثلاً در قطعه کد زیر مقدار عنصر دوم آرایه (با اندیس یک) تغییر میکند و عضو جدیدی نیز به آن اضافه میشود. که نتیجهی این تغییرات را نیز مشاهده میکنید.
fruits[1] = 'Berry';
fruits[3] = 'Melon';
fruits;
← ["Apple", "Berry", "Banana", "Melon"]
در آرایهی فوق، تمام دادهها از نوع رشته هستند. اما هیچ الزامی وجود ندارد که تمام دادههای یک آرایه از یک نوع باشند. در قطعه کد زیر آرایهای را میبینید که عناصر آن از انواع مختلفی هستند.
let mixedArray = ['Apple' , 7 , 2.5 , undefined , null , ['Apple' , 'Orange'] , true];
mixedArray[1];
← 7
mixedArray[3];
← undefined
mixedArray[5];
← ["Apple" , "Orange"]
mixedArray[10];
← undefinded
دو نکتهی بسیار مهم در قطعه کد فوق وجود دارد.
نکتهی اول این است که مقدار یک داده در آرایه میتواند برابر با undefined باشد (عنصر چهارم). در نتیجه وقتی برای خواندن یک عنصر از آرایه با مقدار undefined مواجه میشویم، میتواند دو معنی متفاوت داشته باشد. یا مقدار آن عنصر undefined است و یا کلاً چنین عنصری در آرایه وجود ندارد.
نکتهی دوم این است که میتوان یک آرایه را به عنوان عنصری از آرایهای دیگر به کار برد. در آرایهی فوق، عنصر پنجم یک آرایه است که خود دارای دو عنصر از نوع رشته است. جهت دسترسی به عناصر داخل این آرایه باید از دو اندیس استفاده کنیم. مانند کد زیر :
mixedArray[5][1];
← "Orange"
حذف عناصر آرایه
با استفاده از عملگر delete میتوان یکی از عناصر آرایه را حذف کرد. به قطعه کد زیر توجه کنید.
let fruits = ['Apple' , 'Orange' , 'Banana'];
delete fruits[1];
fruits;
← ["Apple" , empty, "Banana"]
fruits[1];
← undefined
همانطور که مشاهده میکنید، با حذف یک عنصر از آرایه، تعداد عناصر آرایه تغییری نمیکند و همچنان طول این آرایه برابر با ۳ است. اما مقدار عنصر حذف شده برابر با undefined خواهد بود. در ادامهی همین فصل خواهیم دید که چطور میتوان عناصر یک آرایه را به طور کامل حذف کرد. به طوری که حذف عناصر موجب کاهش طول آرایه شود.
آرایهها و ثابتها
در فصل ۲ با ثابتها آشنا شدیم. و دیدیم که ثابتها نیز مانند متغیرها برای ذخیرهسازی دادهها در حافظه به کار برده میشوند. و تفاوت این دو در این است که ثابتها یک بار مقداردهی میشوند و پس از آن قابل تغییر نیستند. اما متغیرها را میتوانند به دفعات متعدد مقداردهی کرد. اما این رفتار در مورد آرایهها (و به طور کلی اشیاء) کمی متفاوت است.
اشیائی که به صورت ثابت تعریف میشوند را نمیتوان مجدداً با عملگر انتساب "=" مقداردهی کرد. اما میتوان مقدار دادههای موجود در آنها را تغییر داد. مثلاً در مورد آرایهها (که نوعی Object هستند)، میتوان عناصر موجود در آرایه را مجدداً مقداردهی کرد. اما نمیتوان یک آرایهی کاملاً جدید را به این ثابت منتسب کرد. به قطعه کد زیر توجه کنید.
const fruits = ['Apple' , 'Orange' , 'Banana'];
fruits[1] = 'Berry';
fruits;
← ["Apple" , "Berry", "Banana"]
fruits = ['Orange' , 'Apple'];
← Uncaught TypeError: Assignment to constant variable.
همانطور که مشاهده میکنید در خط 2، مقدار یکی از عناصر آرایه تغییر داده شده و این کار بدون هیچ اشکالی بر روی یک آرایه که به صورت ثابت تعریف شده است، امکانپذیر است. اما در خط 5، یک آرایهی جدید به ثابت fruits نسبت داده شده است که این کار بر روی ثابتها امکانپذیر نیست. به طور کلی پس از تعریف یک ثابت از نوع Object با کلمهی کلیدی const، امکان انتساب یک مقدار جدید به آن ثابت با عملگر "=" وجود ندارد. اما میتوان اجزاء مختلف آن (مانند عناصر آرایه یا خاصیتهای اشیاء) را تغییر داد.