Ισοδύναμοι Υπολογιστές του ECMAScript

Η κρίση αν δύο μεταβλητές είναι ίσες είναι μια πολύ σημαντική πράξη στην σχεδιασμό προγραμμάτων. Στην επεξεργασία πρωτοτύπων, αυτή η πράξη είναι σχετικά απλή, αλλά όταν涉及到 αντικείμενα, η εργασία γίνεται λίγο πιο σύνθετη.

Το ECMAScript παρέχει δύο σετ επαγγελματιών ισότητας: η ισότητα και η μη ισότητα χρησιμοποιούνται για την επεξεργασία πρωτοτύπων, η πλήρης ισότητα και η μη πλήρης ισότητα χρησιμοποιούνται για την επεξεργασία αντικειμένων.

Ισότητα και μη ισότητα

Στο ECMAScript, η ισότητα εκφράζεται με διπλό ισόσημο (==), επιστρέφει true όταν και μόνο όταν οι δύο αριθμοί είναι ίσοι. Η μη ισότητα εκφράζεται με εκπληκτικό και ισόσημο (!=), επιστρέφει true όταν και μόνο όταν οι δύο αριθμοί δεν είναι ίσοι. Για να προσδιοριστεί αν οι δύο αριθμοί είναι ίσοι, και οι δύο επαγγελματίες κάνουν μετατροπή τύπου.

Οι κανόνες μετατροπής τύπου είναι οι εξής:

  • Αν ένας από τους αριθμούς είναι αξία Boolean, πριν από τον έλεγχο της ισότητας, μετατρέπεται σε αριθμητική αξία. Το false μετατρέπεται σε 0, το true σε 1.
  • Αν ένας από τους αριθμούς είναι αλφαριθμητικός και ο άλλος είναι αριθμός, πριν από τον έλεγχο της ισότητας, προσπαθείται να μετατρέψει το αλφαριθμητικό σε αριθμό.
  • Αν ένας από τους αριθμούς είναι αντικείμενο και ο άλλος είναι αλφαριθμητικός, πριν από τον έλεγχο της ισότητας, προσπαθείται να μετατρέψει το αντικείμενο σε αλφαριθμητικό.
  • Αν ένας από τους αριθμούς είναι αντικείμενο και ο άλλος αριθμός είναι αριθμός, πριν από τον έλεγχο της ισότητας, προσπαθείται να μετατρέψει το αντικείμενο σε αριθμό.

Στη σύγκριση, ο επαγγελματίας αυτός ακολουθεί τις παρακάτω規则:

  • Η τιμή null και το undefined είναι ίσα.
  • Στην έλεγχο ισότητας, δεν πρέπει να μετατρέπεται το null και το undefined σε άλλες τιμές.
  • Αν ένας από τους αριθμούς είναι NaN, η ισότητα επιστρέφει false, η μη ισότητα επιστρέφει true.
  • Αν και οι δύο αριθμοί είναι αντικείμενα, σύγκριται η τιμή της αναφοράς τους. Αν και οι δύο αριθμοί αναφέρονται στο ίδιο αντικείμενο, η ισότητα επιστρέφει true, αλλιώς οι δύο αριθμοί δεν είναι ίσοι.

Σημαντική ένδειξη:Ακόμα και αν και οι δύο αριθμοί είναι NaN, η ισότητα επιστρέφει false, επειδή σύμφωνα με τους κανόνες, NaN δεν ισούται με NaN.

Η παρακάτω τаблицή περιλαμβάνει μερικές ειδικές περιπτώσεις και τα αποτελέσματα τους:

έκφραση τιμή
null == undefined true
"NaN" == NaN false
5 == NaN false
NaN == NaN false
NaN != NaN true
false == 0 true
true == 1 true
true == 2 false
undefined == 0 false
null == 0 false
"5" == 5 true

Πλήρες και μη πλήρες ισόσημο

Οι ίδιοι ορισμοί των ισότητας και μη ισότητας είναι το πλήρες ισόσημο και το μη πλήρες ισόσημο. Αυτοί οι ορισμοί κάνουν το ίδιο με τον ισόσημο και μη ισόσημο, αλλά δεν εκτελούν μετατροπή τύπου πριν από τον έλεγχο ισότητας.

Το πλήρες ισόσημο εκφράζεται με τρία ισόσημα (===), και επιστρέφει true μόνο όταν οι αριθμητικοί αριθμοί είναι ίσοι χωρίς μετατροπή τύπου.

Για παράδειγμα:

var sNum = "66";
var iNum = 66;
alert(sNum == iNum);	//Αποδίδει "true"
alert(sNum === iNum);	//Αποδίδει "false"

Σε αυτό το κείμενο κώδικα, η πρώτη alert χρησιμοποιεί το ισόσημο για να συγκρίνει τη συμβολοσειρά "66" με τον αριθμό 66, αποδίδει "true". Όπως αναφέρθηκε προηγουμένως, αυτό είναι επειδή η συμβολοσειρά "66" θα μετατραπεί σε αριθμό 66, και στη συνέχεια θα συγκριθεί με τον άλλο αριθμό 66. Η δεύτερη alert χρησιμοποιεί το πλήρες ισόσημο χωρίς μετατροπή τύπου για να συγκρίνει τη συμβολοσειρά και τον αριθμό, φυσικά, η συμβολοσειρά δεν είναι ίση με τον αριθμό, οπότε αποδίδει "false".

Η μη ισότητα από το σήμα διπλού ισότητας (!==) εκφράζεται με την προσθήκη ενός εκπληκτικού και δύο ισότητες (!==), και επιστρέφει true μόνο όταν οι αριθμητικοί αριθμοί δεν χρειάζεται να μετατραπούν και δεν είναι ισούς.

Για παράδειγμα:

var sNum = "66";
var iNum = 66;
alert(sNum != iNum);	//Αποδίδει "false"
alert(sNum !== iNum);	//Αποδίδει "true"

Εδώ, η πρώτη alert χρησιμοποιεί μη ισότητα, μετατρέπει τη συμβολοσειρά "66" σε αριθμό 66, ώστε να είναι ίση με τον δεύτερο αριθμητικό αριθμητικό 66. Επομένως, το αποτέλεσμα είναι "false", επειδή οι δύο αριθμητικοί αριθμοί είναι ίσοι. Η δεύτερη alert χρησιμοποιεί μη ισότητα. Η συνάρτηση είναι να ρωτήσει: "sNum" και "iNum" είναι διαφορετικοί; Η απάντηση σε αυτή την ερώτηση είναι: ναι (true), επειδή το sNum είναι συμβολοσειρά και το iNum είναι αριθμός, φυσικά είναι διαφορετικά.