Εκτός από τους πρωτογενείς τύπους δεδομένων όπως το 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 συμπεριλαμβάνει κληρονομημένα κλειδιά στη διάσχισή του.
Σε αυτή την άσκηση, υλοποιείς έναν τρόπο να παρακολουθείς τις υψηλές βαθμολογίες για το πιο δημοφιλές παιχνίδι στην τοπική αίθουσα arcade.
Έχεις 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}
Αν οι παίκτες παραβιάζουν τους κανόνες της αίθουσας arcade, αφαιρούνται χειροκίνητα από τον πίνακα υψηλών βαθμολογιών.
Όρισε τη removePlayer, η οποία δέχεται 2 παραμέτρους:
Αυτή η συνάρτηση θα πρέπει να αφαιρεί την καταχώριση του συγκεκριμένου παίκτη από τον πίνακα και να επιστρέφει τον πίνακα στη συνέχεια. Αν ο παίκτης δεν ήταν εξαρχής στον πίνακα, δεν θα πρέπει να συμβεί τίποτα στον πίνακα. Θα πρέπει να επιστραφεί ως έχει.
removePlayer({ 'Dave Thomas': 0 }, 'Dave Thomas');
// => {}
removePlayer({ 'Dave Thomas': 0 }, 'Rose Fanaras');
// => { 'Dave Thomas': 0 }
Αν ένας παίκτης ολοκληρώσει άλλο ένα παιχνίδι στην αίθουσα arcade, ένα συγκεκριμένο ποσό πόντων θα προστεθεί στην προηγούμενη βαθμολογία στον πίνακα.
Υλοποίησε τη updateScore, η οποία δέχεται 3 παραμέτρους:
Η συνάρτηση θα πρέπει να επιστρέφει τον πίνακα βαθμολογίας αφού γίνει η ενημέρωση.
updateScore({ 'Freyja Ćirić': 12771008 }, 'Freyja Ćirić', 73);
// => {"Freyja Ćirić", 12771081}
Η αίθουσα arcade κρατά έναν ξεχωριστό πίνακα βαθμολογίας τις Δευτέρες. Στο τέλος της ημέρας, κάθε παίκτης σε αυτόν τον πίνακα παίρνει 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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.