علاوه بر انواع دادهی اولیه مثل number و string، یک نوع دادهی مهم دیگر هم در JavaScript وجود دارد که به آن object میگویند.
«شیءها» مجموعههایی از جفتهای کلید-مقدار هستند.
به همین دلیل، میتوان از آنها به همان شکلی استفاده کرد که از آنچه در زبانهای دیگر معمولاً «نقشه» یا «دیکشنری» نامیده میشود.
در زبانهای دیگر، معمولاً همهی مقدارهای یک نقشه باید نوع دادهی یکسانی داشته باشند.
در JavaScript فقط نوع کلید محدود است: باید string باشد.
مقدارهای داخل یک شیء میتوانند نوعهای متفاوتی داشته باشند.
این مقدارها میتوانند انواع اولیه مثل عدد باشند، اما میتوانند آرایه، شیءهای دیگر یا حتی تابع هم باشند.
همین ویژگی شیءها را بسیار انعطافپذیر میکند، تا جایی که در JavaScript به یکی از موجودیتهای کلیدی برنامهنویسی شیءگرا (OOP) تبدیل میشوند.
در ادامه، روی شیءها به عنوان مجموعه یا نقشه تمرکز میکنیم. کاربردهای دیگر شیءها در مفاهیم دیگر بررسی میشوند، برای نمونه کلاس.
برای ساختن یک شیء از «آکولاد» استفاده میکنید. میتوانید چند مورد را هم مستقیم داخل آن بگذارید. برای این کار، اول کلید را بنویسید، بعد از آن دونقطه و سپس مقدار را.
const emptyObject = {};
const obj = {
favoriteNumber: 42,
greeting: 'Hello World',
useGreeting: true,
address: {
street: 'Trincomalee Highway',
city: 'Batticaloa',
},
fruits: ['melon', 'papaya'],
addNumbers: function (a, b) {
return a + b;
},
};
کامای انتهایی بعد از آخرین مورد در JavaScript اختیاری است.
شاید برایتان سؤال پیش بیاید که چرا کلیدها داخل گیومه قرار نگرفتهاند، هرچند قرار است رشته باشند. این یک شکل کوتاهنویسی است. اگر کلید از قواعد نامگذاری شناسه در JavaScript پیروی کند، میتوانید گیومهها را حذف کنید. برای کلیدهایی که در اسمشان نویسههای خاص دارند، باید از همان نوشتار معمول رشته استفاده کنید.
const obj = {
'1keyStartsWithNumber': '...',
'key/with/slashes': '...',
'key-with-dashes': '...',
'key with spaces': '...',
'#&()[]{}èä樹keyWithSpecialChars': '...',
};
برای گرفتن مقدار یک کلید مشخص، دو راه وجود دارد: «نوشتار نقطهای» و «نوشتار کروشهای».
const obj = { greeting: 'hello world' };
obj.greeting;
// => hello world
obj['greeting'];
// => hello world
// Bracket notation also works with variables.
const key = 'greeting';
obj[key];
// => hello world
استفاده از نوشتار نقطهای به شکل کوتاه، همان محدودیت حذف گیومهها را دارد. این روش فقط وقتی کار میکند که کلید از قواعد نامگذاری شناسه پیروی کند.
میتوانید با عملگر انتساب = یک مقدار را اضافه یا تغییر دهید.
باز هم نوشتار نقطهای و کروشهای در دسترس هستند.
const obj = { greeting: 'hello world' };
obj.greeting = 'Hi there!';
obj['greeting'] = 'Welcome.';
obj.newKey1 = 'new value 1';
obj['new key 2'] = 'new value 2';
const key = 'new key 3';
obj[key] = 'new value 3';
میتوانید با کلیدواژهی delete یک جفت کلید-مقدار را از یک شیء حذف کنید.
const obj = {
key1: 'value1',
key2: 'value2',
};
delete obj.key1;
delete obj['key2'];
میتوانید با متد hasOwnProperty بررسی کنید که آیا کلید خاصی در یک شیء وجود دارد یا نه.
const obj = { greeting: 'hello world' };
obj.hasOwnProperty('greeting');
// => true
obj.hasOwnProperty('age');
// => false
یک «حلقهی ویژه» به اسم for...in وجود دارد که روی همهی کلیدهای یک شیء پیمایش میکند.
const obj = {
name: 'Ali',
age: 65,
};
for (let key in obj) {
console.log(key, obj[key]);
}
// name Ali
// age 65
برای جلوگیری از خطاهای ظریف، همیشه باید فرض کنید که حلقهی for...in کلیدها را با ترتیب دلخواهی پیمایش میکند.
همچنین توجه داشته باشید که for...in کلیدهای ارثبریشده را هم در پیمایش خود لحاظ میکند.
در این تمرین، راهی را پیادهسازی میکنید که با آن بتوانید امتیازهای برتر محبوبترین بازی سالن بازی محلیتان را پیگیری کنید.
باید ۵ تابع را پیادهسازی کنید که بیشترشان به دستکاری شیئی مربوط میشوند که امتیازهای برتر را نگه میدارد.
تابعی به اسم createScoreBoard بسازید که شیئی را میسازد و نقش تخته امتیازهای برتر را ایفا میکند.
کلیدهای این شیء اسم بازیکنان خواهند بود و مقدارها امتیاز آنان.
برای اهداف Test، میخواهید یک ورودی را مستقیماً در شیء بگنجانید.
این ورودی اولیه باید از The Best Ever به عنوان اسم بازیکن و 1000000 به عنوان امتیاز تشکیل شده باشد.
createScoreBoard();
// returns an object with one initial entry
برای افزودن بازیکن به تخته امتیازهای برتر، تابع addPlayer را تعریف کنید.
این تابع ۳ پارامتر میپذیرد:
تابع پس از افزودن بازیکن جدید، همان شیء تخته امتیازی را که به آن پاس داده شده بود برمیگرداند.
addPlayer({ 'Dave Thomas': 0 }, 'José Valim', 486373);
// => {'Dave Thomas': 0, 'José Valim': 486373}
اگر بازیکنان قوانین سالن بازی را زیر پا بگذارند، به صورت دستی از تخته امتیازهای برتر حذف میشوند.
تابع removePlayer را تعریف کنید که ۲ پارامتر میگیرد:
این تابع باید ورودی مربوط به بازیکن دادهشده را از تخته حذف کند و سپس تخته را برگرداند. اگر بازیکن از ابتدا روی تخته نبود، نباید هیچ اتفاقی برای تخته بیفتد. باید همانطور که هست برگردانده شود.
removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}
removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }
اگر بازیکنی بازی دیگری را در سالن بازی تمام کند، مقدار مشخصی امتیاز به امتیاز قبلی روی تخته اضافه میشود.
تابع updateScore را پیادهسازی کنید که ۳ پارامتر میگیرد:
تابع باید پس از انجام بهروزرسانی، تخته امتیاز را برگرداند.
updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}
سالن بازی روزهای دوشنبه یک تخته امتیاز جداگانه دارد. در پایان روز، هر بازیکنی که در آن تخته فهرست شده است، ۱۰۰ امتیاز اضافه میگیرد.
تابع applyMondayBonus را پیادهسازی کنید که یک تخته امتیاز میپذیرد.
این تابع امتیازهای پاداش را برای هر بازیکنی که در آن تخته فهرست شده است اضافه میکند.
سپس تخته برگردانده میشود.
const scoreBoard = {
'Dave Thomas': 44,
'Freyja Ćirić': 539,
'José Valim': 265,
};
applyMondayBonus(scoreBoard);
// => { 'Dave Thomas': 144, 'Freyja Ćirić': 639, 'José Valim': 365 }
در Exercism ثبتنام کنید تا JavaScript را همراه با 37 مفهوم159 تمرین و مربیگری انسانی واقعی یاد بگیرید و در آن استاد شوید، همهی اینها رایگان.