Tελεστές σύγκρισης τιμών
Τελεστές σύγκρισης
Στον προγραμματισμό, συχνά χρειαζόμαστε να συγκρίνουμε τιμές για να λάβουμε αποφάσεις. Για παράδειγμα, αν ένα νούμερο είναι μεγαλύτερο από ένα άλλο ή αν δύο λέξεις είναι ίδιες. Σε αυτό το πρόβλημα έρχονται και μας βοηθάνε οι τελεστές σύγκρισης.
Το πιο σημαντικό πράγμα που πρέπει να γνωρίζουμε για τους τελεστές σύγκρισης είναι ότι πάντα επιστρέφουν μια boolean τιμή. Δηλαδή, το αποτέλεσμα μιας σύγκρισης θα είναι είτε true
(αληθές) είτε false
(ψευδές). Όπως θα δούμε σε επόμενα κεφάλαια, οι boolean τιμές, τα αποτελέσματα της σύγκρισης, είναι πολύ σημαντικές στις δομές ελέγχου ροής, όπως τα if
statements και οι βρόχοι επανάληψης, καθώς καθορίζουν την ροή εκτέλεσης του προγράμματός μας.
Ας δούμε ένα γρήγορο παράδειγμα:
1let age = 25;
2let minimumAge = 18;
3
4// Εδώ χρησιμοποιούμε τον τελεστή σύγκρισης `>=`
5let canVote = age >= minimumAge;
6
7console.log(canVote); // Αυτό θα τυπώσει: true
Σε αυτό το παράδειγμα, η έκφραση age >= minimumAge
γινεται evaluate σε true
, επειδή το 25
είναι όντως μεγαλύτερο ή ίσο του 18
, και αυτή η τιμή ανατίθεται στη μεταβλητή canVote
. Αν η τιμή της μεταβλητής age
ήταν 16
, η έκφραση θα επέστρεφε false
. Αυτό το true
ή false
αποτέλεσμα είναι το κλειδί για να “ρωτάμε” τον κώδικά μας και να παίρνουμε απαντήσεις.
Ας δούμε τους τελεστές σύγκρισης.
Τελεστής ισότητας (==
)
Ο τελεστής ισότητας ==
ελέγχει αν δύο τιμές είναι ίσες, αλλά το κάνει με έναν “χαλαρό” τρόπο. Αυτό σημαίνει ότι πριν κάνει τη σύγκριση, προσπαθεί να μετατρέψει–να coerse όπως λέμε στα αγγλικά–τους τελεστέους στον ίδιο τύπο δεδομένων, αν αυτοί είναι διαφορετικοί. Αυτή η διαδικασία της αυτόματης μετατροπής τύπων δεδομένων ονομάζεται type coercion.
console.log(5 == 5); // true (αριθμός με αριθμό - ίδιος τύπος)
console.log("hello" == "hello"); // true (string με string - ίδιος τύπος)
Ενώ μπορεί να φαίνεται βολικό, το type coercion μπορεί συχνά να οδηγήσει σε απροσδόκητα αποτελέσματα και λογικά λάθη, καθώς η JavaScript προσπαθεί να “μαντέψει” τι εννοούμε.
// Ο αριθμός 5 μετατρέπεται σε string "5" ή το string "5" σε αριθμό 5
console.log(5 == "5"); // true
// Το false μετατρέπεται σε αριθμό 0
console.log(0 == false); // true
// Ειδική περιπτώση που τιμές θεωρούνται ίσες όταν η σύγκριση γίνεται με ==
console.log(null == undefined); // true
// Το κενό string μετατρέπεται σε 0
console.log("" == 0); // true
Όπως βλέπετε, το ==
μπορεί να είναι παραπλανητικό επειδή το 5
και το "5"
είναι διαφορετικοί τύποι δεδομένων (αριθμός και string αντίστοιχα), αλλά το ==
τα θεωρεί ίσα λόγω της αυτόματης μετατροπής.
Τελεστής αυστηρής ισότητας (===
)
Ο τελεστής αυστηρής ισότητας ===
ελέγχει αν δύο τιμές είναι ίσες με έναν αυστηρότερο τρόπο. Για να επιστρέψει true
, πρέπει όχι μόνο οι τιμές να είναι ίδιες, αλλά και οι τύποι δεδομένων τους πρέπει να είναι ακριβώς οι ίδιοι. Σε αυτή τη περίπτωση δεν γίνεται καμία αυτόματη μετατροπή. Για παράδειγμα:
1console.log(5 === 5); // true
2console.log("hello" === "hello"); // true
3
4// ίδια τιμή, αλλά διαφορετικός τύπος: number vs string
5console.log(5 === "5"); // false
6
7// ίδια τιμή, αλλά διαφορετικός τύπος: number vs boolean
8console.log(0 === false); // false
9
10// διαφορετικός τύπος, αν και και τα δύο δηλώνουν απουσία τιμής
11console.log(null === undefined);
12
13// διαφορετικός τύπος: string vs number
14console.log("" === 0); // false
15
16let num = 10;
17let strNum = "10";
18console.log(num == strNum); // true (χαλαρή σύγκριση, μετατρέπει το "10" σε 10)
19console.log(num === strNum); // false (αυστηρή σύγκριση, διαφορετικοί τύποι)
Προτιμήστε ===
αντί για ==
!
Λόγω της προβλέψιμης και ασφαλούς συμπεριφοράς του, είναι προτιμότερο να χρησιμοποιείτε τον τελεστή ===
. Θα σας βοηθήσει να αποφύγετε απροσδόκητα λάθη που προκαλούνται από το type coercion που εφαρμόζει ο τελεστής ==
.Όπως βλέπουμε, ο τελεστής ===
είναι πολύ πιο ακριβής και προβλέψιμος. Όταν χρησιμοποιούμε το ===,
είμαστε σίγουροι ότι η σύγκριση γίνεται με βάση την τιμή και τον τύπο, μειώνοντας τις πιθανότητες για σφάλματα (bugs) στον κώδικά μας.
Τελεστής ανισότητας (!=
)
Ο τελεστής !=
χρησιμοποιείται για να ελέγξουμε αν δύο τιμές δεν είναι ίσες. Είναι, στην ουσία, η αντίστροφη λειτουργία του τελεστή ==
. Όπως και ο τελεστής ==
, ο τελεστής !=
εκτελεί μια χαλαρή σύγκριση, πράγμα που σημαίνει ότι εφαρμόζει type coercion πριν κάνει τη σύγκριση.
Αυτό σημαίνει ότι αν οι τύποι δεδομένων των τιμών που συγκρίνετε είναι διαφορετικοί, η JavaScript θα προσπαθήσει να τους μετατρέψει στον ίδιο τύπο πριν αποφασίσει αν είναι διαφορετικοί.
console.log(5 != 10); // true
console.log("hello" != "world"); // true
// το "5" μετατρέπεται σε αριθμό 5, και τότε 5 == 5, άρα δεν προκύπτει ανισότητα
console.log(5 != "5"); // false
// το false μετατρέπεται σε 0, και τότε 0 == 0, άρα δεν προκύπτει ανισότητα
console.log(0 != false); // false
// θεωρούνται ίσα με χαλαρή σύγκριση
console.log(null != undefined); // false
Τελεστής αυστηρής ανισότητας (!==
)
Ο τελεστής !==
χρησιμοποιείται για να ελέγξουμε αν δύο τιμές δεν είναι ίσες με αυστηρό τρόπο. Είναι η αυστηρή αντίστροφη λειτουργία του τελεστή ===
. Αυτός ο τελεστής είναι πολύ πιο ασφαλής και προβλέψιμος από τον τελεστεί !=
, επειδή δεν εφαρμόζει type coercion.
Για να επιστρέψει true
(δηλαδή, να θεωρήσει ότι οι τιμές είναι ανισες), θα πρέπει είτε:
- οι τιμές πρέπει να είναι διαφορετικές.
- ή οι τύποι δεδομένων τους πρέπει να είναι διαφορετικοί.
Αν τόσο οι τιμές όσο και οι τύποι δεδομένων τους είναι ίδιοι, τότε ο τελεστής !==
θα επιστρέψει false
.
1console.log(5 !== 10); // true
2console.log("hello" !== "world"); // true
3console.log(5 !== "5"); // true
4console.log(0 !== false); // true
5console.log(null !== undefined); // true
6console.log(5 !== 5); // false
7console.log("text" !== "text"); // false
Ο τελεστής !==
είναι σχεδόν πάντα η προτιμότερη επιλογή όταν θέλουμε να ελέγξουμε για ανισότητα. Μας προστατεύει από τα απροσδόκητα αποτελέσματα που μπορεί να προκύψουν από το type coersion του !=
. Όταν χρησιμοποιούμε το !==
, ξέρουμε ακριβώς τι συγκρίνουμε και είμαστε σίγουροι ότι ο κώδικάς μας θα συμπεριφερθεί όπως περιμένουμε.
Μεγαλύτερο από (>
)
Ο τελεστής >
ελέγχει αν η τιμή στην αριστερή πλευρά είναι μεγαλύτερη από την τιμή στη δεξιά πλευρά.
console.log(10 > 5); // true
console.log(3 > 7); // false
console.log(5 > 5); // false
Μικρότερο από (<
)
Ο τελεστής <
ελέγχει αν η τιμή στην αριστερή πλευρά είναι μικρότερη από την τιμή στη δεξιά πλευρά.
console.log(5 < 10); // true
console.log(7 < 3); // false
console.log(5 < 5); // false
Μεγαλύτερο ή ίσο με (>=
)
Ο τελεστής >=
ελέγχει αν η τιμή στην αριστερή πλευρά είναι μεγαλύτερη ή ίση με την τιμή στη δεξιά πλευρά.
console.log(10 >= 5); // true
console.log(5 >= 5); // true
console.log(3 >= 7); // false
Μικρότερο ή ίσο με (<=
)
Ο τελεστής <=
ελέγχει αν η τιμή στην αριστερή πλευρά είναι μικρότερη ή ίση με την τιμή στη δεξιά πλευρά.
console.log(5 <= 10); // true
console.log(5 <= 5); // true
console.log(7 <= 3); // false