Προσοχή στον καταναγκασμό: αυτή η προηγμένη λειτουργία μπορεί να είναι η αιτία ανεπαίσθητων σφαλμάτων, επομένως βεβαιωθείτε ότι γνωρίζετε πώς λειτουργεί.

Η δυναμική πληκτρολόγηση της JavaScript σημαίνει ότι ο κώδικάς σας μπορεί να είναι λίγο πιο απλός, αλλά είναι ακόμα πιθανό να κάνετε λάθη. Για να τις αποφύγετε, είναι χρήσιμο να γνωρίζετε πώς η JavaScript επιλύει τιμές με διαφορετικούς τύπους, για να τις συγκρίνετε.

Η κατανόηση της μετατροπής τύπων και του εξαναγκασμού σε JavaScript είναι ζωτικής σημασίας για τη σύνταξη αξιόπιστων και αποτελεσματικών προγραμμάτων. Κάθε έννοια έχει συγκεκριμένες περιπτώσεις χρήσης και βέλτιστες πρακτικές που μπορούν να επηρεάσουν τη συμπεριφορά του κώδικά σας.

Γιατί συμβαίνει η μετατροπή τύπων και ο εξαναγκασμός σε JavaScript;

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

instagram viewer

Δεδομένου ότι οι τύποι δεδομένων δεν δηλώνονται ρητά μέχρι το χρόνο εκτέλεσης, όταν εκτελείτε λειτουργίες που απαιτούν διαφορετικά δεδομένα τύπους, η JavaScript ελέγχει αυτόματα τη συμβατότητά τους μεταξύ τους για τη λειτουργία που θέλετε να εκτελέσετε. Εάν είναι συμβατά μεταξύ τους, η λειτουργία προχωρά κανονικά.

Ωστόσο, ας υποθέσουμε ότι δεν είναι συμβατά με τη λειτουργία—για παράδειγμα, προσπαθείτε να προσθέσετε μια συμβολοσειρά και έναν αριθμό. Σε τέτοιες περιπτώσεις, η JavaScript "αναγκάζει" αυτόματα έναν από τους τύπους να ταιριάζει στον άλλο για να διασφαλίσει ότι η λειτουργία είναι επιτυχής αντί να παρουσιάζει σφάλμα. Αυτή η διαδικασία είναι γνωστή ως καταναγκασμός τύπου ή σιωπηρός εξαναγκασμός.

Τύπος Καταναγκασμός

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

Αλλά δεν μπορούν να εξαναγκαστούν όλοι οι τύποι δεδομένων. Η συμβολοσειρά, ο αριθμός και το boolean είναι τα μόνα Τύποι δεδομένων JavaScript ότι η γλώσσα θα εξαναγκάσει σε διαφορετικό τύπο. Όταν προσπαθείτε να εκτελέσετε μια μη συμβατή λειτουργία με τύπους δεδομένων που η JavaScript δεν μπορεί να εξαναγκάσει, θα εμφανιστεί ένα σφάλμα.

Η JavaScript εξαναγκάζει τύπους με βάση τον τύπο της λειτουργίας και τον τελεστή που χρησιμοποιείτε στη λειτουργία.

Καταναγκασμός με τον χειριστή «+».

Στο JavaScript, το "+Ο τελεστής έχει δύο διαφορετικές συμπεριφορές ανάλογα με τους τύπους των τελεστών του. Μπορεί να εκτελέσει τόσο αριθμητική προσθήκη όσο και συνένωση συμβολοσειρών. Αυτό μπορεί να οδηγήσει σε εξαναγκασμό τύπου όταν ένας από τους τελεστές δεν είναι του αναμενόμενου τύπου.

Εάν και οι δύο τελεστές είναι αριθμοί, το "+” ο χειριστής εκτελεί προσθήκη:

αφήνω num1 = 42;
αφήνω num2 = 10;
αφήνω άθροισμα = num1 + num2; // Πρόσθεση
κονσόλα.log (άθροισμα); // 52

Εάν και οι δύο τελεστές είναι συμβολοσειρές, το "+” Ο τελεστής εκτελεί συνένωση συμβολοσειρών:

αφήνω str1 = "Γειά σου";
αφήνω str2 = "κόσμος";
αφήνω αποτέλεσμα = str1 + " " + str2; // Σύνδεση συμβολοσειρών
κονσόλα.log (αποτέλεσμα); // "Γειά σου Κόσμε"

Ωστόσο, εάν ένας από τους τελεστές δεν είναι συμβολοσειρά, η JavaScript θα τον εξαναγκάσει σιωπηρά σε μια συμβολοσειρά πριν εκτελέσει τη συνένωση:

// Αριθμός και συμβολοσειρά
αφήνω αριθμός = 42;
αφήνω str = "Γειά σου";

Το // num εξαναγκάζεται σε μια συμβολοσειρά και στη συνέχεια συνδέεται
αφήνω result_1 = num + str;
κονσόλα.log (αποτέλεσμα_1); // "42 Γεια σου"

// String και Boolean
αφήνω μπολ = αληθής;

Το // bool εξαναγκάζεται σε μια συμβολοσειρά και στη συνέχεια συνδέεται
αφήνω result_2 = bool + str;
κονσόλα.log (αποτέλεσμα_2); // "trueHello"

Καταναγκασμός με τον χειριστή «-».

Στο JavaScript, το "-Ο τελεστής χρησιμοποιείται κυρίως για πράξεις αφαίρεσης. Όταν ένας ή και οι δύο τελεστές σε μια πράξη που περιλαμβάνει το "-"Ο χειριστής δεν είναι αριθμός, η JavaScript θα προσπαθήσει να τον εξαναγκάσει σε έναν αριθμό.

Όταν και οι δύο τελεστές είναι αριθμοί, η JavaScript εκτελεί αφαίρεση. Εκτελεί επίσης αφαίρεση όταν ένας ή και οι δύο τελεστές είναι συμβολοσειρές που αντιπροσωπεύουν έναν αριθμό:

συνθ num1 = 10;
συνθ num2 = 20;
συνθ αποτέλεσμα_1 = num2 - num1; // Αφαίρεση
κονσόλα.log (αποτέλεσμα_1); // 10

συνθ strNum = "10";
συνθ strNum2 = "20";
συνθ αποτέλεσμα = strNum2 - strNum; // Πληκτρολογήστε εξαναγκασμό στους αριθμούς και μετά αφαίρεση
κονσόλα.log (αποτέλεσμα_1); // 10

Όταν κανένας από τους τελεστές δεν είναι αριθμός ή συμβολοσειρά που αντιπροσωπεύει έναν αριθμό, η JavaScript θα προσπαθήσει να εξαναγκάσει τον τύπο δεδομένων στο αριθμητικό του ισοδύναμο. Εάν ο τύπος δεδομένων δεν έχει αριθμητικό ισοδύναμο, η λειτουργία θα επιστρέψει NaN (Όχι αριθμός):

// το true παίρνει εξαναγκασμένο στο 1, το false παίρνει εξαναγκασμένο στο 0
συνθ boolNum = αληθής;
συνθ boolNum2 = ψευδής;
συνθ result_1 = boolNum - boolNum2;
κονσόλα.log (αποτέλεσμα_1); // 1

// οι κενοί πίνακες εξαναγκάζονται στο 0
συνθ arrNum = [];
συνθ arrNum2 = [];
συνθ result_2 = arrNum - arrNum2;
κονσόλα.log (αποτέλεσμα_2); // 0

// τα άδεια αντικείμενα εξαναγκάζονται σε NaN
συνθ objNum = {};
συνθ result_3 = arrNum - objNum;
κονσόλα.log (αποτέλεσμα_3); // 0 - NaN = NaN

Σε αυτό το παράδειγμα, η JavaScript εξαναγκάζει τις τιμές boolean αληθής και ψευδής στις αριθμητικές ισοδύναμες τιμές τους, 1 και 0, αντίστοιχα. Οι κενές συστοιχίες αναγκάζονται να 0, και τα άδεια αντικείμενα εξαναγκάζονται να NaN.

Καταναγκασμός Με τους Χειριστές Ισότητας (==)/().

Στο JavaScript, οι τελεστές ισότητας (== και ) συγκρίνετε τις τιμές για την ισότητα. Ωστόσο, συμπεριφέρονται διαφορετικά λόγω εξαναγκασμού τύπου.

Ο "==Ο τελεστής (χαλαρή ισότητα) εκτελεί καταναγκασμό τύπου, που σημαίνει ότι προσπαθεί να μετατρέψει τελεστές στον ίδιο τύπο πριν από τη σύγκριση:

"10" == 10; // αληθές

Σε αυτό το παράδειγμα, η JavaScript εξαναγκάζει τη συμβολοσειρά "10" στον αριθμό 10, επομένως η έκφραση υπολογίζεται σε αληθής.

Ωστόσο, το "Ο χειριστής (αυστηρή ισότητα) δεν εκτελεί εξαναγκασμό τύπου. Απαιτεί η τιμή και ο τύπος να είναι τα ίδια για να επιστρέψει η σύγκριση αληθής:

"10"10; // ψευδής

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

Θα πρέπει γενικά να χρησιμοποιείτε το τελεστής (αυστηρής ισότητας) σε JavaScript για αποφυγή απροσδόκητης συμπεριφοράς καταναγκασμού.

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

Μετατροπή τύπου

Η μετατροπή τύπων, γνωστή και ως μετατροπή τύπων, είναι η ρητή διαδικασία μετατροπής μιας τιμής από έναν τύπο δεδομένων σε έναν άλλο σε JavaScript χρησιμοποιώντας ενσωματωμένες συναρτήσεις όπως π.χ. Αριθμός(), Σειρά(), Boolean (), parseInt(), και parseFloat().

Μπορείτε να πραγματοποιήσετε μετατροπή τύπου μεταβιβάζοντας την τιμή που θέλετε να μετατρέψετε στις ενσωματωμένες συναρτήσεις μετατροπής ως όρισμα. Αυτές οι συναρτήσεις στη συνέχεια μετατρέπουν την τιμή σας στον επιθυμητό τύπο.

Ακολουθεί ένα παράδειγμα χρησιμοποιώντας το Αριθμός() λειτουργία:

συνθ numStr = "123";
συνθ αριθμός = Αριθμός(numStr); // Μετατρέπει μια συμβολοσειρά σε αριθμό
κονσόλα.log (αριθμός); // 123

Μεταβίβαση μιας συμβολοσειράς που είναι έγκυρος αριθμός ως όρισμα στο Αριθμός() η λειτουργία θα επιστρέψει έναν αριθμό. Η μετάδοση μιας συμβολοσειράς που δεν είναι έγκυρος αριθμός θα επιστρέψει NaN.

Ακολουθεί ένα παράδειγμα χρησιμοποιώντας το Σειρά() λειτουργία:

συνθ μπολ = αληθής;
συνθ str2 = Σειρά(bool); // Μετατρέπει ένα boolean σε συμβολοσειρά
κονσόλα.log (str2); // "αληθινό"

Μεταβίβαση οποιουδήποτε τύπου δεδομένων στο αρχείο εκτός από ένα σύμβολο στο Σειρά() η λειτουργία θα μετατρέψει τον τύπο δεδομένων σε συμβολοσειρά.

Ακολουθεί ένα παράδειγμα χρησιμοποιώντας το Boolean () λειτουργία:

// Μετατροπή συμβολοσειράς σε boolean (αλήθεια: true, falsy: false)
συνθ str = "Γειά σου";
συνθ bool2 = Boolean(str);
κονσόλα.log (bool2); // αληθές

Περνώντας αληθείς αξίες στο Boolean () Η συνάρτηση επιστρέφει το boolean "true" ενώ περνώντας ψευδείς τιμές επιστρέφει το boolean "false".

Ακολουθεί ένα παράδειγμα χρησιμοποιώντας το ParseInt() και ParseFloat() λειτουργία:

// Μετατροπή συμβολοσειράς σε ακέραιο
συνθ numStr = "123.00";
συνθ num1 = parseInt(numStr);
κονσόλα.log (αριθμός1); // 123

// Μετατροπή συμβολοσειράς σε αριθμό κινητής υποδιαστολής
συνθ floatStr = "3.14";
συνθ num2 = parseFloat(floatStr);
κονσόλα.log (αριθμός2); // 3.14

ο parseInt() Η συνάρτηση αναλύει ένα όρισμα συμβολοσειράς και επιστρέφει έναν ακέραιο. ο parseFloat() η συνάρτηση μετατρέπει μια συμβολοσειρά σε αριθμό κινητής υποδιαστολής.

Μόχλευση Τύπου Καταναγκασμός και Μετατροπή

Κατανοώντας τον εξαναγκασμό τύπου και τη μετατροπή, μπορείτε να λάβετε τεκμηριωμένες αποφάσεις σχετικά με το πότε και πώς να τις αξιοποιήσετε αποτελεσματικά στον κώδικά σας. Είναι σημαντικό να επιτύχετε τη σωστή ισορροπία, χρησιμοποιώντας συνετά τον καταναγκασμό τύπου για συνοπτικό και βολικό κώδικα και βασιζόμενοι σε ρητή μετατροπή τύπου για σκόπιμες και προβλέψιμες μετατροπές τύπου.