Sobes.tech
Junior

Τι συμβαίνει στην JavaScript κατά τη μη αυστηρή σύγκριση (==);

sobes.tech AI

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

Στη μη αυστηρή σύγκριση (==) στην JavaScript, πραγματοποιείται μια μετατροπή τύπων (coercion) των τελεστών πριν από τη σύγκριση. Αν οι τύποι των τελεστών διαφέρουν, η JavaScript προσπαθεί να μετατρέψει έναν ή και τους δύο τελεστές σε έναν κοινό τύπο, βασιζόμενη σε μια σειρά κανόνων.

Κύριοι κανόνες μετατροπής με ==:

  1. Αριθμός και συμβολοσειρά: Η συμβολοσειρά μετατρέπεται σε αριθμό. Αν η μετατροπή αποτύχει (NaN), το αποτέλεσμα είναι πάντα false.
    // "10" μετατρέπεται σε 10. Αποτέλεσμα: true
    console.log(10 == "10");
    // "abc" μετατρέπεται σε NaN. Αποτέλεσμα: false
    console.log(10 == "abc");
    
  2. Boolean και μη-Boolean: Το Boolean μετατρέπεται σε αριθμό (true σε 1, false σε 0). Στη συνέχεια, συγκρίνονται ο αριθμός και ο άλλος τελεστής.
    // true μετατρέπεται σε 1. Αποτέλεσμα: true
    console.log(true == 1);
    // false μετατρέπεται σε 0. Αποτέλεσμα: true
    console.log(false == 0);
    // false μετατρέπεται σε 0, "0" μετατρέπεται σε 0. Αποτέλεσμα: true
    console.log(false == "0");
    
  3. Null και Undefined: Το null συγκρίνεται με το undefined ως true, και με τίποτα άλλο (εκτός από τον εαυτό του) ως true.
    // Αποτέλεσμα: true
    console.log(null == undefined);
    // Αποτέλεσμα: false
    console.log(null == 0);
    // Αποτέλεσμα: false
    console.log(undefined == 0);
    
  4. Object και primitive: Το αντικείμενο μετατρέπεται σε primitive (χρησιμοποιώντας τις μεθόδους valueOf ή toString), και στη συνέχεια συγκρίνονται τα primitives.
    // Το αντικείμενο μετατρέπεται σε συμβολοσειρά "10" (μέσω toString()), και συγκρίνεται με τον αριθμό 10
    // "10" μετατρέπεται σε 10. Αποτέλεσμα: true
    console.log({ toString: () => "10" } == 10);
    
  5. Σύμβολο και άλλο: Τα σύμβολα μπορούν να συγκριθούν μόνο με άλλο σύμβολο ή primitive στο οποίο το σύμβολο μπορεί να μετατραπεί (που στην πράξη είναι αδύνατο).
    // Αποτέλεσμα: false
    console.log(Symbol('a') == 'a');
    

Η μη αυστηρή σύγκριση μπορεί να οδηγήσει σε απροσδόκητα αποτελέσματα λόγω αυτόματης μετατροπής τύπων. Για πιο προβλέψιμη συμπεριφορά, συνιστάται η χρήση αυστηρής σύγκρισης (===), η οποία δεν πραγματοποιεί μετατροπή τύπων και συγκρίνει άμεσα τους τελεστές.