با عرض سلام خدمت کاربران محترم سایت پی وی لرن.
در این جلسه قصد داریم به آرایه ها در جاوا اسکریپت JavaScript و ساخت آرایه در جاوا اسکریپت بپردازیم.
همانطور که قبلا نیز اشاره کردیم، آرایه ها در جاوا اسکریپت (به طور کلی در تمام زبان ها) برای ذخیره چندین داده در یک متغیر استفاده می شود.
یک آرایه متغیر خاصی هست که در یک زمان می تواند چندین مقدار را در خود جای دهد.
اگر شما لیستی از آیتم هایی داشته باشید و بخواهید آن ها را در متغیر های جداگانه ذخیره کنید،(مثل نام اتومبیل ها) نتیجه کار شبیه کد زیر خواهد بود:
1 2 3 | var car1 = "Saab"; var car2 = "Volvo"; var car3 = "BMW"; |
حال اگر بخواهید دنبال یک اتومبیل خاص بگردید چه کار خواهید کرد؟ و اگر تعداد اتومبیل ها ۳۰۰ دستگاه بود چه؟
پاسخ سوال استفاده از آرایه است.
یک آرایه بسیاری از مقادیر را تحت یک نام ذخیره می کند و برای دسترسی به اعضای آرایه کافیست از اندیس آرایه استفاده کنیم.
عناصر آرایه داخل براکت تعریف شده و با , از یکدیگر جدا می شوند.
ساختار دستور:
1 | var array_name = [item1, item2, ...]; |
مثال:
فضاهای و خطوط شکسته مهم نیستند. یک اعلامیه می تواند خطوط چندگانه داشته باشد:
نکته : قرار دادن کاما بعد از آخرین عنصر (مانند “BMW”)، در مرورگرها متناقض است. در IE 8 و قبل از آن پشتیبانی نمی شود.
مثال زیر نیز یک آرایه ایجاد می کند و مقادیر را به آن اختصاص می دهد:
برای بدست آوردن یک عنصر آرایه از اندیس آن عنصر استفاده می کنیم:
1 | var name = cars[0]; |
همچنین می توانیم با استفاده از اندیس عناصر مقدار آن ها را تغییر دهیم:
1 | cars[0] = "Opel"; |
نکته: اندیس ها در آرایه از ۰ شروع می شوند.
این دستور ارزش عنصر اول در cars تغییر می دهد:
1 | cars[0] = "Opel"; |
1 2 3 | var cars = ["Saab", "Volvo", "BMW"]; cars[0] = "Opel"; document.getElementById("demo").innerHTML = cars[0]; |
برای دسترسی به تمام عناصر آرایه تنها کافیست از نام آرایه به تنهایی استفاده کنیم:
1 2 | var cars = ["Saab", "Volvo", "BMW"]; document.getElementById("demo").innerHTML = cars; |
خروجی به شکل زیر خواهد بود:
1 | Saab,Volvo,BMW |
آرایه ها نوع خاصی از اشیا هستند. عملگر typeof نوع object را برای آرایه ها بر میگرداند.
اما بهتر است به عنوان همان آرایه توصیفش کنیم.
آرایه ها برای دسترسی به عناصر خود از اعداد استفاده می کنند. در این مثال، [person[0 مقدار John را برمی گرداند:
آبجکت ها از name ها برای دسترسی به اعضاء استفاده می کنند، در این مثال person.firstName مقدار John را برمی گرداند:
1 | var person = {firstName:"John", lastName:"Doe", age:46}; |
در یک آرایه می توانید متغیر هایی با نوع های متفاوت داشته باشید.
می توانید اشیا را در آرایه داشته باشید.
می توانید توابع را در رایه داشته باشید و می توانید آرایه ها را در آرایه داشته باشید:
1 2 3 | myArray[0] = Date.now; myArray[1] = myFunction; myArray[2] = myCars; |
قدرت واقعی آرایه ها در جاوا اسکریپت، توابع و پروپرتی های مربوط به آن هاست:
1 2 | var x = cars.length; // The length property returns the number of elements var y = cars.sort(); // The sort() method sorts arrays |
برای بدست آوردن طول آرایه در جاوا اسکریپت از پروپرتی length استفاده می کنیم:
1 2 | var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.length; // 4 |
نکته : خصوصیت length همیشه یکی از بالاترین index آرایه هاست.
1 2 | fruits = ["Banana", "Orange", "Apple", "Mango"]; var first = fruits[0]; |
1 2 | fruits = ["Banana", "Orange", "Apple", "Mango"]; var last = fruits[fruits.length - 1]; |
بهترین راه برای پیمایش در آرایه استفاده از حلقه های تکرار می باشد:
1 2 3 4 5 6 7 8 | var fruits, text, fLen, i; fruits = ["Banana", "Orange", "Apple", "Mango"]; fLen = fruits.length; text = "<ul>"; for (i = 0; i < fLen; i++) { text += "<li>" + fruits[i] + "</li>"; } |
شما همچنین می توانید از تابع ()Array.forEach استفاده کنید :
1 2 3 4 5 6 7 8 9 10 | var fruits, text; fruits = ["Banana", "Orange", "Apple", "Mango"]; text = "<ul>"; fruits.forEach(myFunction); text += "</ul>"; function myFunction(value) { text += "<li>" + value + "</li>"; } |
راحت ترین راه برای اضافه کردن عناصر به آرایه استفاده از تابع ()push می باشد:
1 2 | var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits.push("Lemon"); // adds a new element (Lemon) to fruits |
راه دیگر برای اضافه کردن عناصر به آرایه استفاده از اندیس است:
1 2 | var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits[fruits.length] = "Lemon"; // adds a new element (Lemon) to fruits |
اخطار :
اضافه کردن عناصر با index های بالا می تواند “holes” نامشخص در آرایه ایجاد کند:
1 2 | var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits[6] = "Lemon"; // adds a new element (Lemon) to fruits |
بسیاری از زبان های برنامه نویسی از اندیس های نامی پشتیبانی می کنند.
آرایه های با اندیس نامی، آرایه های انجمنی یا hash نامیده می شوند.
جاوا اسکریپت از آرایه های انجمنی استفاده نمی کند و همیشه از اندیس عددی استفاده می کند.
در همینجا یکی از تفاوت های بزرگ آرایه و اشیا مشخص می شود.
1 2 3 4 5 6 | var person = []; person[0] = "John"; person[1] = "Doe"; person[2] = 46; var x = person.length; // person.length will return 3 var y = person[0]; // person[0] will return "John" |
اخطار : اگر از index های نامیده شده استفاده می کنید، جاوا اسکریپت آرایه را به آبجکت استاندارد باز تعریف می کند.
پس از آن، برخی از روش ها و خواص آرایه نتایج اشتباهی را تولید خواهند کرد.
1 2 3 4 5 6 | var person = []; person["firstName"] = "John"; person["lastName"] = "Doe"; person["age"] = 46; var x = person.length; // person.length will return 0 var y = person[0]; // person[0] will return undefined |
در جاوا اسکریپت، آرایه ها از index های عددی استفاده می کنند.
در جاوا اسکریپت، آبجکت به عنوان index استفاده می شود.
نکته : آرایه ها یک نوع خاص از آبجکت هستند که دارای index های عددی می باشند.
آرایه ها را می توان با کلمه کلیدی new نیز تعریف کرد اما ا این کار بپرهیزید.
زیرا این کار باعث کاهش سرعت برنامه و عملکرد آن می باشد.
1 2 | var points = new Array(40, 100, 1, 5, 25, 10); // Bad var points = [40, 100, 1, 5, 25, 10]; // Good |
کد زیر شامل دو دستور است که هر دو آرایه ای شامل ۶ عنصر عددی را ایجاد می کنند :
1 2 | var points = new Array(40, 100, 1, 5, 25, 10); // Bad var points = [40, 100, 1, 5, 25, 10]; // Good |
استفاده از کلمه ی کلیدی new کد را پیچیده تر می کند، این همچنین می تواند نتایج غیر منتظره ای را تولید کند.
1 | var points = new Array(40, 100); // Creates an array with two elements (40 and 100) |
اما اگر از مثال فوق یکی از عناصر مثلا ۱۰۰ را حذف کنیم، آنگاه یک آرایه با ۴۰ عنصر ناشناس ایجاد خواهد شد!!!
با وجود شباهت های بین آرایه و اشیا، تشخیص آرایه از شئ کار سختی می باشد.
در کد زیر عملگر typeof در جاوا اسکریپت یک object را برمی گرداند:
1 2 3 | var fruits = ["Banana", "Orange", "Apple", "Mango"]; typeof fruits; // returns object |
عملگر typeof یک آبجکت را برمی گرداند، زیرا یک آرایه جاوا اسکریپت یک آبجکت است.
راه حل اول :
در ECMAScript 5 برای حل این مشکل متد جدید ()Array.isArray تعریف شده است :
راه حل فوق در مرورگرهای قدیمی پشتیبانی نمی شود.
راه حل دوم :
برای حل این مشکل می توانید خود یک تابع isArray () ایجاد کنید:
1 2 3 | function isArray(x) { return x.constructor.toString().indexOf("Array") > -1; } |
اگر آرگومان یک آرایه باشد، تابع بالا همیشه true خواهد شد.
یا دقیق تر: اگر نمونه اولیه آبجکت حاوی کلمه “Array” باشد، true می شود.
راه حل سوم:
عملگر typeof را برمی گرداند، زیرا یک آرایه جاوااسکری یک شی است.
اما با دستور instanceof می توان بررسی کرد که آیا متغیر آرایه هست یا نه:
1 2 3 | var fruits = ["Banana", "Orange", "Apple", "Mango"]; fruits instanceof Array // returns true |
جلسه کار با آرایه ها در جاوا اسکریپت نیز به پایان رسید.