إلى جانب أنواع البيانات الأولية مثل number وstring، هناك نوع بيانات مهم آخر في JavaScript يُسمى object.
الكائنات مجموعات من أزواج المفتاح والقيمة.
وبذلك يمكن استخدامها بالطريقة نفسها التي تُستخدم بها ما يُشار إليه غالبًا باسم الخرائط أو القواميس في لغات أخرى.
في لغات أخرى، غالبًا ما تحتاج جميع القيم في الخريطة إلى أن تكون من نوع البيانات نفسه.
أما في JavaScript، فالنوع الوحيد المقيَّد هو نوع المفتاح: إذ يجب أن يكون string.
ويمكن أن تكون القيم داخل الكائن الواحد من أنواع مختلفة.
فقد تكون أنواعًا أولية مثل الأعداد، ولكنها قد تكون أيضًا مصفوفات أو كائنات أخرى أو حتى دوال.
وهذا يجعل الكائنات متعددة الاستخدامات إلى حد كبير، حتى إنها تُعد أيضًا كيانات أساسية في البرمجة كائنية التوجه (OOP) في JavaScript.
في ما يلي، سنركّز على الكائنات بوصفها مجموعات أو خرائط. وسنغطي حالات استخدام أخرى للكائنات في مفاهيم أخرى، انظر مثلًا الأصناف.
تُنشئ كائنًا باستخدام الأقواس المعقوفة. يمكنك أيضًا تضمين بعض المُدخلات مباشرة. ولذلك، اذكر المفتاح أولًا، ثم نقطتين، ثم القيمة.
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 يتضمّن المفاتيح الموروثة في تكراره.
في هذا التمرين، ستكتب كودًا لتتبّع أفضل النقاط لأكثر لعبة شعبية في صالة الألعاب القريبة منك.
لديك 5 دوال لتُنفّذها، ومعظمها يتعلق بالتعامل مع كائن يحمل أفضل النقاط.
أنشئ دالة createScoreBoard تُنشئ كائنًا يعمل كلوحة أفضل النقاط.
ستكون مفاتيح هذا الكائن أسماء اللاعبين، وستكون قيمه نقاطهم.
لأغراض الاختبار، تريد تضمين مدخل واحد مباشرةً في الكائن.
يجب أن يتضمّن هذا المدخل الأولي The Best Ever اسمًا للاعب و1000000 كنقاط.
createScoreBoard();
// returns an object with one initial entry
لإضافة لاعب إلى لوحة أفضل النقاط، عرّف الدالة addPlayer.
وهي تقبل 3 معاملات:
تُرجع الدالة كائن لوحة أفضل النقاط نفسه الذي مُرّر إليها بعد إضافة اللاعب الجديد.
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، وهي تقبل 3 معاملات:
يجب أن تُرجع الدالة لوحة أفضل النقاط بعد إجراء التحديث.
updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}
تحتفظ صالة الألعاب بلوحة أفضل نقاط منفصلة أيام الاثنين. في نهاية اليوم، يحصل كل لاعب على تلك اللوحة على 100 نقطة إضافية.
نفّذ الدالة 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 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.