Το να γνωρίζεις τον τύπο ενός δεδομένου είναι συχνά πολύ σημαντικό για να τρέχει ο κώδικας ομαλά και χωρίς σφάλματα.
Η 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 δε θα λειτουργήσει με έναν πίνακα που δημιουργήθηκε σε διαφορετικό περιβάλλον εκτέλεσης, όπως ένα iframe σε μια ιστοσελίδα, το Array.isArray() θα λειτουργήσει.
Αυτό συμβαίνει επειδή η κλάση Array έχει διαφορετικό κατασκευαστή σε κάθε περιβάλλον εκτέλεσης, και κάθε iframe έχει το δικό του περιβάλλον, που σημαίνει ότι η συνάρτηση στην αλυσίδα πρωτοτύπων θα είναι διαφορετική, με αποτέλεσμα το 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
Σε έχουν προσλάβει σε ένα κέντρο ανακύκλωσης. Λόγω έλλειψης χώρου, όλα τα προϊόντα μπαίνουν στον ίδιο ιμάντα μεταφοράς, αλλά αυτό έχει οδηγήσει στο να αναμειγνύονται διαφορετικά υλικά μεταξύ τους, με αποτέλεσμα να γίνονται άχρηστα. Για να το διορθώσεις, σου έχει ανατεθεί να φτιάξεις συναρτήσεις που αναγνωρίζουν τον τύπο ενός προϊόντος.
Υλοποίησε τη συνάρτηση isBoolean, που ελέγχει αν μια τιμή είναι boolean.
isBoolean(true);
// => true
isBoolean(null);
// => false
Υλοποίησε τη συνάρτηση isNumber, που ελέγχει αν μια τιμή είναι ένας πεπερασμένος number ή bigint, δηλαδή όχι NaN ή Infinity.
Μερικές φορές, η συσκευή ανάγνωσης ID αποτυγχάνει και διαβάζει μια μη αριθμητική τιμή ως NaN (Not a Number) ή Infinity.
Η συνάρτησή σου θα πρέπει να μπορεί να το χειριστεί σωστά κι αυτό.
isNumber(42);
// => true
isNumber('Hello, World!');
// => false
isNumber(42n);
// => true
isNumber(NaN);
// => false
Υλοποίησε τη συνάρτηση isObject, που θα πρέπει να ελέγχει αν η τιμή είναι αντικείμενο.
Στον ιμάντα, το null δεν είναι τίποτα και δεν θεωρείται αντικείμενο.
isObject({ greeting: 'Hello' });
// => true
isObject(25n);
// => false
Υλοποίησε τη συνάρτηση isNumericString, που θα πρέπει να ελέγχει αν η τιμή είναι μια συμβολοσειρά που αποτελείται μόνο από ψηφία ή από ένα μείον ακολουθούμενο από ψηφία, που δηλώνει αρνητικό αριθμό.
Μόνο οι ακέραιοι θα πρέπει να λαμβάνονται υπόψη, τα δεκαδικά δεν θεωρούνται αριθμητικά για αυτόν τον έλεγχο του ρομπότ ανακύκλωσης.
isNumericString(42);
// => false
isNumericString('42');
// => true
isNumericString('Hi!');
// => false
Υλοποίησε τη συνάρτηση isElectronic, που ελέγχει αν ένα αντικείμενο είναι στιγμιότυπο της παρεχόμενης κλάσης ElectronicDevice ή μιας από τις υποκλάσεις της.
class Duck {
//...
}
class WashingMachine extends ElectronicDevice {
//...
}
isElectronic(new Duck());
// => false
isElectronic(new WashingMachine());
// => true
Υλοποίησε τη συνάρτηση isNonEmptyArray, που ελέγχει αν μια τιμή είναι μη κενός πίνακας.
isNonEmptyArray([1, 2, 3]);
// => true
isNonEmptyArray([]);
// => false
Υλοποίησε τη συνάρτηση isEmptyArray, που ελέγχει αν μια τιμή είναι κενός πίνακας.
isEmptyArray([1, 2, 3]);
// => false
isEmptyArray([]);
// => true
type
Υλοποίησε τη συνάρτηση hasType, που ελέγχει αν ένα αντικείμενο έχει ιδιότητα ή μέθοδο type.
class Keyboard(){
type(){
// ...
}
}
hasType({ type:"car", color:"red" })
// => true
hasType({ color:"green" })
// => false
hasType(new Keyboard())
// => true
id
Υλοποίησε τη συνάρτηση assertHasId, που θα πετάει ένα Error αν από ένα αντικείμενο λείπει η ιδιότητα id.
Αν ένα αντικείμενο έχει την ιδιότητα id, δεν θα πρέπει να επιστρέφει τίποτα.
assertHasId({ id: 42, color: 'red' });
// => undefined
assertHasId({ color: 'green' });
// Error: "Object is missing the 'id' property"
id
Υλοποίησε τη συνάρτηση hasIdProperty, που ελέγχει αν ένα αντικείμενο έχει ιδιότητα id.
class SimpleData {
constructor() {
this.number = '42';
this.id = 'BC269327FE1D9B95';
}
}
class StealingData extends SimpleData {}
class MethodData {
constructor() {
this.number = '42';
this._id = 'BC269327FE1D9B95';
}
get id() {
return this._id;
}
}
hasIdProperty(new SimpleData());
// => true
hasIdProperty(new MethodData());
// => false
hasIdProperty(new StealingData());
// => false
type
Υλοποίησε τη συνάρτηση hasDefinedType, που ελέγχει αν ένα αντικείμενο έχει ιδιότητα type που δεν είναι undefined.
hasDefinedType({ type: undefined, color: 'red' });
// => false
hasDefinedType({ type: 'car', color: 'green' });
// => true
Γράψου στο Exercism για να μάθεις και να κατακτήσεις JavaScript με 37 έννοιες159 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.