Το να γνωρίζεις ποιος είναι ο τύπος ενός δεδομένου είναι συχνά πολύ σημαντικό, ώστε ο κώδικας να εκτελείται ομαλά και χωρίς σφάλματα.
Η Javascript έχει αρκετούς τρόπους να ελέγξεις τον τύπο μιας τιμής ή ενός αντικειμένου.
Οι μηχανισμοί ελέγχου τύπων της Javascript μπορεί να είναι κάπως αναξιόπιστοι.
Για καλύτερη ασφάλεια τύπων και πιο ισχυρούς τύπους, καλύτερα να χρησιμοποιήσεις TypeScript, μια γλώσσα που βασίζεται στη JavaScript, αλλά με τη σύνταξη τύπων μιας γλώσσας στατικής τυποποίησης.
typeof
Ο τελεστής typeof επιστρέφει τον τύπο του τελεστέου του.
Η έξοδος είναι μια συμβολοσειρά που ταιριάζει με το όνομα ενός από τους πρωτόγονους τύπους δεδομένων, εκτός από το "null".
Μπορεί επίσης να είναι "function" ή "object".
typeof undefined;
// => "undefined"
typeof true;
// => "boolean"
typeof 42;
// => "number"
typeof 'Hello, World!';
// => "string"
typeof function () {
return 'Hello, World';
};
// => "function"
typeof [1, 2, 3, 4];
// => "object"
typeof { city: 'Stockholm', country: 'Sweden' };
// => "object"
Για [ιστορικούς λόγους][typeof null is "object"].
instanceof
Για να ελέγξεις τον τύπο ενός αντικειμένου, μπορείς να χρησιμοποιήσεις τον τελεστή instanceof.
Αξιολογείται σε boolean ανάλογα με το αν ο δεύτερος τελεστέος περιλαμβάνεται στην αλυσίδα πρωτοτύπων του πρώτου τελεστέου.
Για να το ξεκαθαρίσουμε, το instanceof θα επιστρέψει αν ο πρώτος τελεστέος είναι στιγμιότυπο του δεύτερου τελεστέου ή μιας από τις υποκλάσεις του.
Το instanceof λειτουργεί μόνο με αντικείμενα.
class Beverage {
// ...
}
// The Coffee class is a child of the Beverage class.
class Coffee extends Beverage {
// ...
}
const java = new Coffee();
java instanceof Coffee;
// => true
java instanceof Beverage;
// => true
Η κλάση Array έχει μια μέθοδο που ονομάζεται Array.isArray(), η οποία ελέγχει αν το όρισμά της είναι πίνακας.
Ενώ το instanceof Array δεν θα λειτουργήσει με έναν πίνακα που δημιουργήθηκε σε ένα διαφορετικό realm, όπως ένα iframe σε μια ιστοσελίδα, το Array.isArray() θα λειτουργήσει.
Αυτό συμβαίνει επειδή η κλάση Array έχει διαφορετικό κατασκευαστή σε κάθε realm, και κάθε iframe έχει το δικό του realm, που σημαίνει ότι η συνάρτηση στην αλυσίδα πρωτοτύπων θα είναι διαφορετική, με αποτέλεσμα το instanceof Array να αποτύχει.
Το Array.isArray() μπορεί να το αγνοήσει αυτό και θα πρέπει να χρησιμοποιείται πάντα όταν είναι δυνατόν.
Μπορεί επίσης να αντιμετωπίσει ψευδώς θετικά αποτελέσματα, όπου ένα αντικείμενο δεν είναι στην πραγματικότητα ένα Array και απλώς έχει το Array στην αλυσίδα πρωτοτύπων του.
({ __proto__: Array.prototype }) instanceof Array
// => true
Array.isArray({ __proto__: Array.prototype })
// => false
in
Ο τελεστής in επιστρέφει αν ο πρώτος τελεστέος είναι ιδιότητα του δεύτερου τελεστέου.
Δεν ελέγχει αν η ιδιότητα έχει ορισμένη τιμή.
Μια ιδιότητα που έχει οριστεί σε undefined θα εντοπιστεί και πάλι από το in.
class Coffee {
constructor() {
this.temperature = 'hot';
this.isDarkMatter = undefined;
}
coolDown() {
this.temperature = 'warm';
}
}
const espresso = new Coffee();
'temperature' in espresso;
// => true
'color' in espresso;
// => false
'isDarkMatter' in espresso;
// => true
Το in θα επιστρέψει true για κληρονομημένες ιδιότητες και μεθόδους.
"coolDown" in espresso
// => true
"constructor" in espresso
// => true
Για να το αποφύγεις αυτό, χρησιμοποίησε αντ' αυτού το Object.hasOwn()
Object.hasOwn()
Η μέθοδος Object.hasOwn() επιστρέφει αν το καθορισμένο αντικείμενο κατέχει τη δεδομένη ιδιότητα (δεν είναι κληρονομημένη ή μέθοδος).
class Coffee {
constructor() {
this.temperature = 'hot';
}
coolDown() {
this.temperature = 'warm';
}
}
const cappuccino = new Coffee();
Object.hasOwn(cappucino, 'temperature');
// => true
Object.hasOwn(cappucino, 'constructor');
// => false
Object.hasOwn(cappucino, 'coolDown');
// => false