Sobes.tech
Junior

Τι ελέγχει ο τελεστής instanceof στην JavaScript;

sobes.tech AI

Απάντηση από AI

Ο τελεστής instanceof στην JavaScript ελέγχει αν ένα αντικείμενο είναι μια περίπτωση συγκεκριμένης κλάσης ή κατασκευαστή.

Αρχή λειτουργίας:

  1. Ο τελεστής instanceof ελέγχει αν το prototype του κατασκευαστή υπάρχει στη αλυσίδα πρωτοτύπων του αντικειμένου.
  2. Αν το prototype του κατασκευαστή βρίσκεται στην αλυσίδα, το αποτέλεσμα είναι true.
  3. Διαφορετικά, το αποτέλεσμα είναι false.

Παραδείγματα:

// Δημιουργία κλάσης
class Animal {
  // Κατασκευαστής
  constructor(name) {
    this.name = name;
  }
}

// Δημιουργία στιγμιότυπου της κλάσης
let dog = new Animal("Buddy");

// Έλεγχος αν το dog είναι στιγμιότυπο της Animal
console.log(dog instanceof Animal); // true

// Έλεγχος αν το dog είναι στιγμιότυπο του Object (είναι, μέσω της αλυσίδας πρωτοτύπων)
console.log(dog instanceof Object); // true

// Έλεγχος αν το dog είναι στιγμιότυπο του Array (δεν είναι)
console.log(dog instanceof Array); // false

// Έλεγχος με ενσωματωμένους τύπους
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true

let num = 123;
console.log(num instanceof Number); // false (για primitives, το `instanceof` συμπεριφέρεται συγκεκριμένα)
// Για primitives που δημιουργούνται με new
let numObj = new Number(123);
console.log(numObj instanceof Number); // true

Χαρακτηριστικά:

  • Το instanceof λειτουργεί μέσω της αλυσίδας πρωτοτύπων, επομένως το αποτέλεσμα μπορεί να είναι true και για τους γονικούς κατασκευαστές.
  • Για primitive τύπους (string, number, boolean, null, undefined, symbol, bigint), το instanceof γενικά επιστρέφει false αν δεν έχουν δημιουργηθεί μέσω του αντίστοιχου αντικειμένου-περιτύλιξης (new String(), new Number(), κ.λπ.).
  • Μπορεί να είναι ανακριβές όταν εργάζεστε με διαφορετικά περιβάλλοντα εκτέλεσης JavaScript (π.χ. διαφορετικά παράθυρα ή iframe), καθώς κάθε περιβάλλον έχει τους δικούς του κατασκευαστές.

Παρόμοιες προσεγγίσεις για έλεγχο τύπου:

  • typeof: επιστρέφει μια συμβολοσειρά που υποδεικνύει τον βασικό τύπο δεδομένων (string, number, boolean, object, function, undefined, symbol, bigint). Δεν είναι κατάλληλο για έλεγχο αν ένα αντικείμενο ανήκει σε μια συγκεκριμένη κλάση.
  • Object.prototype.toString.call(): επιστρέφει μια πιο ακριβή συμβολοσειρά με τον τύπο του αντικειμένου ("[object Array]", "[object Date]", κ.λπ.).

Γενικά, το instanceof είναι χρήσιμο για τον έλεγχο αν ένα αντικείμενο ανήκει σε μια συγκεκριμένη κλάση ή στον προγόνου της στην ιεραρχία κληρονομιάς.