Χρησιμοποιώ το JSLint για να ελέγξω τη JavaScript και επιστρέφει πολλές προτάσεις για την αντικατάσταση του ==
(δύο σημεία ισότητας) με το ===
(τρία σημεία ισότητας) όταν κάνουμε πράγματα όπως η σύγκριση του idSele_UNVEHtype.value.length == 0
μέσα σε μια δήλωση if
.
Υπάρχει κάποιο πλεονέκτημα απόδοσης από την αντικατάσταση του ==
με ===
;
Οποιαδήποτε βελτίωση των επιδόσεων θα ήταν ευπρόσδεκτη καθώς υπάρχουν πολλοί τελεστές σύγκρισης.
Εάν δεν πραγματοποιείται μετατροπή τύπου, θα υπήρχε κέρδος απόδοσης σε σχέση με το ==
;
Ο τελεστής ταυτότητας (===
) συμπεριφέρεται πανομοιότυπα με τον τελεστή ισότητας (==
) με τη διαφορά ότι δεν γίνεται μετατροπή τύπου και οι τύποι πρέπει να είναι ίδιοι για να θεωρηθούν ίσοι.
Αναφορά: Javascript Tutorial: Comparison Operators
Ο τελεστής ==
θα συγκρίνει για ισότητα αφού κάνει τις απαραίτητες μετατροπές τύπου. Ο τελεστής ===
θα δεν κάνει τη μετατροπή, οπότε αν δύο τιμές δεν είναι του ίδιου τύπου, ο τελεστής ===
θα επιστρέψει απλά false
. Και οι δύο είναι εξίσου γρήγοροι.
Για να παραθέσω το εξαιρετικό βιβλίο του Douglas Crockford JavaScript: The Good Parts,
Η JavaScript έχει δύο σύνολα τελεστών ισότητας: ===
και !==
, και τα σατανικά τους δίδυμα ==
και !=
. Οι καλοί λειτουργούν με τον τρόπο που θα περιμένατε. Αν οι δύο τελεστές είναι του ίδιου τύπου και έχουν την ίδια τιμή, τότε ο ===
παράγει true
και ο !==
παράγει false
. Τα κακά δίδυμα κάνουν το σωστό πράγμα όταν οι τελεστές είναι του ίδιου τύπου, αλλά αν είναι διαφορετικού τύπου, προσπαθούν να εξαναγκάσουν τις τιμές. οι κανόνες με τους οποίους το κάνουν αυτό είναι περίπλοκοι και δυσμνημόνευτοι. Αυτές είναι μερικές από τις ενδιαφέρουσες περιπτώσεις:
'' == '0' // false 0 == '' // true 0 == '0' // true
false == 'false' // false false == '0' // true
false == undefined // false false == null // false null == undefined // true
' \t\r\n ' == 0 // true
Η έλλειψη μεταβατικότητας είναι ανησυχητική. Η συμβουλή μου είναι να μην χρησιμοποιείτε ποτέ τα κακά δίδυμα. Αντ' αυτού, να χρησιμοποιείτε πάντα τα
===
και!==
. Όλες οι συγκρίσεις που μόλις παρουσιάστηκαν παράγουνfalse
με τον τελεστή===
.
@Casebash στα σχόλια και στην @Phillipe Laybaert's απάντηση σχετικά με τους τύπους αναφοράς. Για τους τύπους αναφοράς ==
και ===
ενεργούν με συνέπεια μεταξύ τους (εκτός από μια ειδική περίπτωση).
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // false
a === b // false
c == d // false
c === d // false
e == f // true
e === f // true
Η ειδική περίπτωση είναι όταν συγκρίνετε ένα λεκτικό με ένα αντικείμενο που αποτιμάται στο ίδιο λεκτικό, λόγω της μεθόδου toString
ή valueOf
. Για παράδειγμα, θεωρήστε τη σύγκριση ενός αλφαριθμητικού literal με ένα αντικείμενο string που δημιουργήθηκε από τον κατασκευαστή String
.
"abc" == new String("abc") // true
"abc" === new String("abc") // false
Εδώ ο τελεστής ==
ελέγχει τις τιμές των δύο αντικειμένων και επιστρέφει true
, αλλά ο τελεστής ===
βλέπει ότι δεν είναι του ίδιου τύπου και επιστρέφει false
. Ποιος από τους δύο είναι σωστός; Αυτό εξαρτάται πραγματικά από το τι προσπαθείτε να συγκρίνετε. Η συμβουλή μου είναι να παρακάμψετε εντελώς την ερώτηση και απλά να μην χρησιμοποιείτε τον κατασκευαστή String
για να δημιουργήσετε αντικείμενα string.
Αναφορά http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
Χρήση του τελεστή ==
(Equality)
true == 1; //true, because 'true' is converted to 1 and then compared
"2" == 2; //true, because "2" is converted to 2 and then compared
Χρήση του τελεστή ===
(Ιδιότητα)
true === 1; //false
"2" === 2; //false
Αυτό συμβαίνει επειδή ο τελεστής ισοτιμίας ==
κάνει συνδιαλλαγή τύπου, που σημαίνει ότι ο διερμηνέας προσπαθεί σιωπηρά να μετατρέψει τις τιμές πριν από τη σύγκριση.
Από την άλλη πλευρά, ο τελεστής ταυτότητας ===
δεν κάνει coercion τύπου, και συνεπώς δεν μετατρέπει τις τιμές κατά τη σύγκριση, και επομένως είναι ταχύτερος (σύμφωνα με τη δοκιμή This JS benchmark), καθώς παραλείπει ένα βήμα.
Είναι απίθανο να υπάρχει διαφορά απόδοσης μεταξύ των δύο λειτουργιών στη χρήση σας. Δεν χρειάζεται να γίνει μετατροπή τύπου επειδή και οι δύο παράμετροι είναι ήδη του ίδιου τύπου. Και οι δύο πράξεις θα έχουν μια σύγκριση τύπου ακολουθούμενη από μια σύγκριση τιμής.