Junior
Τι συμβαίνει στην JavaScript κατά τη μη αυστηρή σύγκριση (==);
sobes.tech AI
Απάντηση από AI
Στη μη αυστηρή σύγκριση (==) στην JavaScript, πραγματοποιείται μια μετατροπή τύπων (coercion) των τελεστών πριν από τη σύγκριση. Αν οι τύποι των τελεστών διαφέρουν, η JavaScript προσπαθεί να μετατρέψει έναν ή και τους δύο τελεστές σε έναν κοινό τύπο, βασιζόμενη σε μια σειρά κανόνων.
Κύριοι κανόνες μετατροπής με ==:
- Αριθμός και συμβολοσειρά: Η συμβολοσειρά μετατρέπεται σε αριθμό. Αν η μετατροπή αποτύχει (NaN), το αποτέλεσμα είναι πάντα
false.// "10" μετατρέπεται σε 10. Αποτέλεσμα: true console.log(10 == "10"); // "abc" μετατρέπεται σε NaN. Αποτέλεσμα: false console.log(10 == "abc"); - 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"); - Null και Undefined: Το
nullσυγκρίνεται με τοundefinedωςtrue, και με τίποτα άλλο (εκτός από τον εαυτό του) ωςtrue.// Αποτέλεσμα: true console.log(null == undefined); // Αποτέλεσμα: false console.log(null == 0); // Αποτέλεσμα: false console.log(undefined == 0); - Object και primitive: Το αντικείμενο μετατρέπεται σε primitive (χρησιμοποιώντας τις μεθόδους
valueOfήtoString), και στη συνέχεια συγκρίνονται τα primitives.// Το αντικείμενο μετατρέπεται σε συμβολοσειρά "10" (μέσω toString()), και συγκρίνεται με τον αριθμό 10 // "10" μετατρέπεται σε 10. Αποτέλεσμα: true console.log({ toString: () => "10" } == 10); - Σύμβολο και άλλο: Τα σύμβολα μπορούν να συγκριθούν μόνο με άλλο σύμβολο ή primitive στο οποίο το σύμβολο μπορεί να μετατραπεί (που στην πράξη είναι αδύνατο).
// Αποτέλεσμα: false console.log(Symbol('a') == 'a');
Η μη αυστηρή σύγκριση μπορεί να οδηγήσει σε απροσδόκητα αποτελέσματα λόγω αυτόματης μετατροπής τύπων. Για πιο προβλέψιμη συμπεριφορά, συνιστάται η χρήση αυστηρής σύγκρισης (===), η οποία δεν πραγματοποιεί μετατροπή τύπων και συγκρίνει άμεσα τους τελεστές.