Διαδρομές
/
JavaScript
JavaScript
/
Ύλη
/
Έλεγχος τύπων
Έλ

Έλεγχος τύπων σε JavaScript

1 άσκηση

Σχετικά με την έννοια Έλεγχος τύπων

Το να γνωρίζεις ποιος είναι ο τύπος ενός δεδομένου είναι συχνά πολύ σημαντικό, ώστε ο κώδικας να εκτελείται ομαλά και χωρίς σφάλματα.

Η Javascript έχει αρκετούς τρόπους να ελέγξεις τον τύπο μιας τιμής ή ενός αντικειμένου.

Note

Οι μηχανισμοί ελέγχου τύπων της 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
Advanced

Η κλάση 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
Note

Το 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
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Έλεγχος τύπων