Στη JavaScript, οι τιμές μπορεί να είναι διαφορετικών τύπων. Την αλλαγή του τύπου μιας μεταβλητής μπορείς να την κάνεις με ρητή μετατροπή τύπου. Εκτός από αυτό, η JavaScript εκτελεί και εξαναγκασμό τύπου (έμμεση μετατροπή τύπου) όταν το πλαίσιο το απαιτεί.
Η JavaScript δεν έχει κάποια δομή για να κάνεις cast μια τιμή σε (διαφορετικό) τύπο, όπως πολλές άλλες γλώσσες, αλλά μπορείς να χρησιμοποιήσεις αντ' αυτού κάποιες ενσωματωμένες βοηθητικές συναρτήσεις.
Πιο συγκεκριμένα, οι Boolean, Number και String μπορούν να χρησιμοποιηθούν ως συναρτήσεις για τη μετατροπή μιας τιμής στον αντίστοιχο τύπο.
Με το Boolean(value) μπορείς να μετατρέψεις οποιαδήποτε τιμή σε boolean.
Υπάρχει ένα συγκεκριμένο σύνολο τιμών, οι λεγόμενες falsy τιμές, που μετατρέπονται σε false.
Το πιο σημαντικό είναι ότι οι false, 0, η κενή συμβολοσειρά, το null, το undefined και το NaN είναι falsy.
Για όλες τις άλλες τιμές, το Boolean επιστρέφει true.
Αυτές οι τιμές ονομάζονται truthy.
Boolean(-1);
// => true
Boolean(0);
// => false
Boolean(' ');
// => true
Boolean('');
// => false
Σημείωσε ότι, εξαιτίας των κανόνων που περιγράφηκαν, τα '0', 'false', [] και {} είναι truthy στη JavaScript.
Το Number(value) μπορεί να χρησιμοποιηθεί για τη μετατροπή μιας τιμής σε αριθμό.
Τα κενά στην αρχή και στο τέλος μιας συμβολοσειράς αγνοούνται και μια κενή συμβολοσειρά μετατρέπεται σε 0.
Αν προσπαθήσεις να μετατρέψεις μια μη πρωτόγονη τιμή ή μια συμβολοσειρά που δεν αντιπροσωπεύει αριθμό, το αποτέλεσμα είναι NaN (Not-A-Number).
Number(' -12.34 ');
// => -12.34
Number('1,2');
// => NaN
Number('');
// => 0
Number({ num: 123 });
// => NaN
Με το String(value) μπορείς να μετατρέψεις μια τιμή σε συμβολοσειρά.
Για τις πρωτόγονες τιμές, το αποτέλεσμα είναι αυτό που θα περίμενες.
String(12.34);
// => '12.34'
String(false);
// => 'false'
String(null);
// => 'null'
String(undefined);
// => 'undefined'
Για τους πίνακες, η συνάρτηση String εφαρμόζει τη μετατροπή σε συμβολοσειρά σε κάθε στοιχείο και ενώνει τα αποτελέσματα με κόμμα.
Μπορείς επίσης να εφαρμόσεις ο ίδιος τη μέθοδο join, π.χ. για να προσαρμόσεις το διαχωριστικό.
Σημείωσε ότι σε αυτές τις περιπτώσεις τα null και undefined μετατρέπονται σε κενή συμβολοσειρά.
String([42, null, true, 'abc']);
// => '42,,true,abc'
Για τα αντικείμενα, από προεπιλογή το String επιστρέφει ένα κείμενο που δεν σε βοηθάει καθόλου.
String({ key: 'value' });
// => '[object Object]'
Σε ορισμένα πλαίσια, η JavaScript μετατρέπει αυτόματα μια τιμή σε άλλον τύπο δεδομένων προτού αξιολογήσει κάποια εντολή. Αυτή η έμμεση μετατροπή ονομάζεται εξαναγκασμός τύπου.
Όταν μια τιμή που δεν είναι boolean χρησιμοποιείται σε πλαίσιο boolean, η JavaScript εφαρμόζει τους ίδιους κανόνες με τη συνάρτηση Boolean για να μετατρέψει την τιμή έμμεσα.
Ο εξαναγκασμός σε boolean εμφανίζεται συνήθως:
if
?
!
&& και OR || (το αποτέλεσμα της έκφρασης είναι ένας από τους τελεστέους, όχι απαραίτητα boolean)const num = 0;
if (num) {
// this block is NOT executed because 0 is falsy
}
Αν ο τελεστής πρόσθεσης + χρησιμοποιηθεί με πρωτόγονες τιμές και ο ένας τελεστέος είναι συμβολοσειρά, τότε και ο άλλος θα εξαναγκαστεί σε συμβολοσειρά.
Η λογική της μετατροπής είναι ίδια με αυτήν της συνάρτησης String.
Στη συνέχεια, οι δύο συμβολοσειρές συνενώνονται.
let name;
'hello ' + name;
// => 'hello undefined'
Πολλοί τελεστές εξαναγκάζουν τους τελεστέους σε αριθμούς (αν χρειάζεται) σύμφωνα με τη λογική της συνάρτησης Number που εξηγήθηκε παραπάνω.
+ (αν δεν εμπλέκεται συμβολοσειρά), -, *, /, %, **
+, -
>, >=, <, <=
|, &, ^, ~
Ανατρέξε στη λίστα τελεστών του MDN για περισσότερες λεπτομέρειες σχετικά με οποιονδήποτε από αυτούς τους τελεστές.
Για να αποφεύγεις λάθη, είναι καλή πρακτική να καλείς πάντα το Number ρητά πριν εφαρμόσεις αυτούς τους τελεστές.
Ο φίλος σου ο Kojo είναι μεγάλος λάτρης των αριθμών. Έχει έναν μικρό ιστότοπο που λέγεται 'fun-with-numbers'. Ο Kojo δεν είναι και τόσο καλός στον προγραμματισμό, γι’ αυτό σου ζήτησε βοήθεια.
Θα φτιάξεις δύο βοηθητικές συναρτήσεις για νέα παιχνίδια με αριθμούς στον ιστότοπο του Kojo και μια τρίτη για να ελέγχεις κάποια είσοδο που μπορεί να δώσει ο χρήστης.
Ένα από τα παιχνίδια στον ιστότοπο του Kojo μοιάζει με κουλοχέρη που δείχνει δύο ομάδες τροχών με ψηφία πάνω τους. Κάθε ομάδα ψηφίων αντιπροσωπεύει έναν αριθμό. Για τη μηχανική του παιχνιδιού, ο Kojo πρέπει να ξέρει το άθροισμα αυτών των δύο αριθμών.
Γράψε μια συνάρτηση twoSum που δέχεται δύο πίνακες ως παραμέτρους.
Κάθε πίνακας αποτελείται από έναν ή περισσότερους αριθμούς μεταξύ 0 και 9.
Η συνάρτηση πρέπει να ερμηνεύει κάθε πίνακα ως αριθμό και να επιστρέφει το άθροισμα αυτών των δύο αριθμών.
twoSum([1, 2, 3], [0, 7]);
//=> 130
// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130
Ένα άλλο παιχνίδι στον ιστότοπο είναι ένα μικρό κουίζ που λέγεται "Τυχεροί Αριθμοί". Ο χρήστης μπορεί να εισάγει έναν αριθμό και μετά βλέπει αν ο αριθμός ανήκει σε κάποια μυστική ακολουθία ή μοτίβο. Η ακολουθία ή το μοτίβο των "τυχερών αριθμών" αλλάζει κάθε μήνα και κάθε χρήστης έχει μόνο περιορισμένο αριθμό προσπαθειών για να το μαντέψει.
Οι τυχεροί αριθμοί αυτού του μήνα πρέπει να είναι αριθμοί που είναι παλίνδρομοι. Οι παλινδρομικοί αριθμοί παραμένουν ίδιοι όταν αντιστρέφονται τα ψηφία τους.
Υλοποίησε τη νέα συνάρτηση luckyNumber που δέχεται έναν αριθμό ως παράμετρο.
Η συνάρτηση πρέπει να επιστρέφει true αν ο αριθμός είναι παλίνδρομος και false διαφορετικά.
Ο αριθμός εισόδου θα είναι πάντα θετικός ακέραιος.
luckyNumber(1441);
//=> true
luckyNumber(123);
//=> false
Σε διάφορα σημεία του ιστότοπου υπάρχουν πεδία εισαγωγής όπου οι χρήστες μπορούν να εισάγουν αριθμούς και να πατήσουν ένα κουμπί για να ενεργοποιήσουν κάποια ενέργεια. Ο Kojo θέλει να βελτιώσει την εμπειρία χρήσης του ιστότοπού του. Θέλει να εμφανίζει ένα μήνυμα σφάλματος σε περίπτωση που ο χρήστης πατήσει το κουμπί αλλά το πεδίο περιέχει μια μη έγκυρη τιμή εισόδου.
Ορίστε μερικές ακόμη πληροφορίες για το πώς παρέχεται η τιμή ενός πεδίου εισαγωγής.
undefined ή null.Γράψε μια συνάρτηση errorMessage που δέχεται την είσοδο του χρήστη ως παράμετρο.
Αν ο χρήστης δεν έδωσε καμία είσοδο, η errorMessage πρέπει να επιστρέφει 'Required field'.
Αν η είσοδος δεν αντιπροσωπεύει έναν μη μηδενικό αριθμό (σύμφωνα με τους κανόνες μετατροπής της JavaScript), πρέπει να επιστρέφεται 'Must be a number besides 0'.
Σε όλες τις άλλες περιπτώσεις, μπορείς να υποθέσεις ότι η είσοδος είναι έγκυρη και η τιμή επιστροφής πρέπει να είναι κενή συμβολοσειρά.
errorMessage('123');
// => ''
errorMessage('');
// => 'Required field'
errorMessage('abc');
// => 'Must be a number besides 0'
Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.