Τύποι Ανάφερσης του ECMAScript

Οι τύποι αναφοράς συχνά ονομάζονται κλάσεις (class).

Αυτό το έργο θα συζητήσει πολλά προκαθορισμένα τύπους αναφοράς του ECMAScript.

Τύποι αναφοράς

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

Αυτό το έργο θα συζητήσει πολλά προκαθορισμένα τύπους αναφοράς του ECMAScript.

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

Συμβουλή:Αυτό το μάθημα θα χρησιμοποιήσει τον όρο "αντικείμενο".

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

var o = new Object();

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

var o = new Object;

Σημείωση:Αν και τα παρενθέσεις δεν είναι απαραίτητες, είναι καλύτερο να χρησιμοποιούνται για να αποφευχθεί η σύγχυση.

Συμβουλή:Θα εξετάσουμε περισσότερο τα αντικείμενα και τη συμπεριφορά τους στο κεφάλαιο βασικών αρχείων.

Το κύριο σημείο αυτού του κεφαλαίου είναι οι αναφερόμενες τύποι που έχουν ισοδύναμες αρχικές τύπους.

Το αντικείμενο Object

Το αντικείμενο Object δεν έχει ιδιαίτερη χρήση, αλλά πρέπει να το κατανοήσουμε πριν από άλλες τάξεις. Επειδή το αντικείμενο Object στην ECMAScript είναι παρόμοιο με το java.lang.Object στη Java, όλα τα αντικείμενα στην ECMAScript αποδίδονται από αυτό το αντικείμενο, και όλες οι ιδιότητες και οι μεθόδους του αντικειμένου Object εμφανίζονται σε άλλα αντικείμενα, οπότε η κατανόηση του αντικειμένου Object επιτρέπει μια καλύτερη κατανόηση των άλλων αντικειμένων.

Το αντικείμενο Object έχει τις ακόλουθες ιδιότητες:

constructor
Αναφορά στη συνάρτηση που δημιουργεί το αντικείμενο (πρίσμα). Για το αντικείμενο Object, αυτό το πρίσμα κατευθύνεται στην αρχική συνάρτηση Object().
Prototype
Αναφορά στο αντικείμενο του προτύπου του αντικειμένου. Για όλα τα αντικείμενα, αυτό επιστρέφει μια εγγραφή του Object.

Το αντικείμενο Object έχει επίσης μερικές μεθόδους:

hasOwnProperty(property)
Αναγνωρίζει αν το αντικείμενο έχει μια συγκεκριμένη ιδιότητα. Η ιδιότητα πρέπει να καθοριστεί με μια αλφαριθμητική τιμή (π.χ., o.hasOwnProperty("name"))
IsPrototypeOf(object)
Αναγνωρίζει αν το αντικείμενο είναι προτύπο του άλλου αντικειμένου.
PropertyIsEnumerable
Αναγνωρίζει αν η δεδομένη ιδιότητα μπορεί να εντοπιστεί με τη χρήση της σύνταξης for...in.
ToString()
Επιστρέφει την αρχική αλφαριθμητική παράσταση του αντικειμένου. Για το αντικείμενο Object, η ECMA-262 δεν ορίζει αυτήν την τιμή, οπότε διαφορετικές υλοποιήσεις ECMAScript έχουν διαφορετικές τιμές.
ValueOf()
Επιστρέφει την αρχική τιμή που ταιριάζει στο αντικείμενο. Για πολλούς αντικείμενα, η τιμή που επιστρέφει αυτή η μέθοδος είναι ίδια με την τιμή που επιστρέφει το ToString().

Σημειώσεις:Κάθε μια από τις αναγραφόμενες ιδιότητες και μεθόδους θα καλύπτονται από άλλα αντικείμενα.

Το αντικείμενο Boolean

Το αντικείμενο Boolean είναι ένα αναφερόμενο τύπος του αρχικού τύπου Boolean.

Για να δημιουργήσετε ένα αντικείμενο Boolean, απλά παραδώστε την τιμή Boolean ως παράμετρο.

var oBooleanObject = new Boolean(true);

Το αντικείμενο Boolean θα καλύπτει τη μέθοδο ValueOf() του αντικειμένου Object, επιστρέφοντας την αρχική τιμή, δηλαδή true και false. Η μέθοδος ToString() θα καλύπτεται επίσης, επιστρέφοντας την αλφαριθμητική συμβολοσειρά "true" ή "false".

Δυστυχώς, το αντικείμενο Boolean χρησιμοποιείται πολύ σπάνια στο ECMAScript, και ακόμα και όταν χρησιμοποιείται, είναι δύσκολο να κατανοηθεί.

Το πρόβλημα συνήθως εμφανίζεται όταν χρησιμοποιείται το αντικείμενο Boolean σε boolean εκφράσεις. Για παράδειγμα:

var oFalseObject = new Boolean(false);
var bResult = oFalseObject && true;	// Εκτύπωση true

Σε αυτόν τον κώδικα, δημιουργούμε ένα αντικείμενο Boolean με την τιμή false. Στη συνέχεια, χρησιμοποιούμε αυτήν την τιμή για την operation AND με την αρχική τιμή true. Το αποτέλεσμα της operation AND μεταξύ false και true στη boolean αριθμητική είναι false. Ωστόσο, σε αυτήν την γραμμή κώδικα, υπολογίζεται το oFalseObject, όχι η τιμή του false.

Ωστόσο, όπως συζητήσαμε προηγουμένως, σε boolean εκφράσεις, όλα τα αντικείμενα θα μετατραπούν αυτόματα σε true, οπότε η τιμή του oFalseObject είναι true. Στη συνέχεια, το true θα εκτελέσει την operation AND με το true, με αποτέλεσμα να είναι true.

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

Δείτε

Για περισσότερες πληροφορίες σχετικά με το αντικείμενο Boolean, επισκεφθείτε Εγχειρίδιο αναφοράς του αντικειμένου Boolean του JavaScript.

Το αντικείμενο Number

Ωστόσο, όπως μπορείτε να φανταστείτε, το αντικείμενο Number είναι ένα αναφερόμενο τύπος του αρχικού τύπου Number. Για να δημιουργήσετε ένα αντικείμενο Number, χρησιμοποιήστε τον παρακάτω κώδικα:

var oNumberObject = new Number(68);

Πρέπει να έχετε ήδη αναγνωρίσει το αντικείμενο Number που αναφέρεται στην προηγούμενη ενότητα αυτού του κεφαλαίου όταν συζητήσαμε για ειδικές τιμές (όπως Number.MAX_VALUE). Όλες οι ειδικές τιμές είναι σταatic attributes του αντικειμένου Number.

Για να αποκτήσετε το αρχικό τιμή του αντικειμένου Number, απλά χρησιμοποιήστε τη μέθοδο valueOf():

var iNumber = oNumberObject.valueOf();

Φυσικά, η κλάση Number έχει επίσης τη μέθοδο toString(), η οποία έχει εξεταστεί σε λεπτομέρεια στο κεφάλαιο για τη μετατροπή τύπων.

Εκτός από τις τυπικές μεθόδους που περιέχονται από το Object, το Number έχει και μερικές ειδικές μεθόδους για τη διαχείριση αριθμών.

Η μέθοδος toFixed()

Η μέθοδος toFixed() επιστρέφει τη μορφή του αριθμού με καθορισμένο αριθμό ψηφίων μετά το δεκαδικό σημείο. Για παράδειγμα:

var oNumberObject = new Number(68);
alert(oNumberObject.toFixed(2));  // Εξαγωγή "68.00"

Σε αυτή την περίπτωση, ο παράμετρος της μεθόδου toFixed() είναι 2, οπότε πρέπει να εμφανιστούν δύο ψηφία μετά το δεκαδικό σημείο. Η μέθοδος αυτή επιστρέφει "68.00", τα κενά των κενών αριθμών συμπληρώνονται με 0. Για εφαρμογές που χειρίζονται χρήματα, αυτή η μέθοδος είναι πολύ χρήσιμη. Η μέθοδος toFixed() μπορεί να εκφράσει αριθμούς με 0 έως 20 ψηφία μετά το δεκαδικό σημείο, οι τιμές που ξεπερνούν αυτό το όριο προκαλούν σφάλμα.

Η μέθοδος toExponential()

Μια άλλη μέθοδος που σχετίζεται με τη μορφοποίηση αριθμών είναι η toExponential(), η οποία επιστρέφει τη μορφή του αριθμού σε μορφή επιστημονικής εξάντησης.

Παρόμοια με τη μέθοδο toFixed(), η μέθοδος toExponential() έχει επίσης έναν παράμετρο που καθορίζει τον αριθμό των ψηφίων του μικρού αριθμού που πρέπει να εκτυπωθούν. Για παράδειγμα:

var oNumberObject = new Number(68);
alert(oNumberObject.toExponential(1));  // Εξαγωγή "6.8e+1"

Το αποτέλεσμα αυτού του κώδικα είναι "6.8e+1", όπως έχει εξηγήσει προηγουμένως, σημαίνει 6.8x101Το πρόβλημα είναι τι θα κάνουμε αν δεν γνωρίζουμε ποια μορφή (προκαθορισμένη ή εξάντηση) πρέπει να χρησιμοποιήσουμε για την εκφράση του αριθμού; Μπορούμε να χρησιμοποιήσουμε τη μέθοδο toPrecision().

Η μέθοδος toPrecision()

Η μέθοδος toPrecision() επιστρέφει την προκαθορισμένη μορφή ή τη μορφή εξάντησης του αριθμού με βάση την πιο σημαντική μορφή. Έχει ένα παράμέτρο, τον αριθμό των ψηφίων που χρησιμοποιούνται για την εκφράση του αριθμού (χωρίς την εξάντηση). Για παράδειγμα,

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(1));  // Εξαγωγή "7e+1"

Η εργασία αυτού του κώδικα είναι να εκφράσει τον αριθμό 68 με ένα ψηφίο, το αποτέλεσμα είναι "7e+1", με άλλη μορφή δηλαδή 70. Είναι αληθές ότι η μέθοδος toPrecision() γίνεται γρήγορη. Αλλά αν εκφράσουμε τον αριθμό 68 με δύο ψηφία, είναι πολύ πιο εύκολο:

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(2));  // Εξαγωγή "68"

Φυσικά, η έξοδος είναι "68", γιατί αυτό είναι η ακριβής εκφράση του αριθμού. Αλλά τι θα συνέβαινε αν ορίζονταν περισσότερα ψηφία από όσα χρειάζονται;

var oNumberObject = new Number(68);
alert(oNumberObject.toPrecision(3));  //εκτυπώνει "68.0"

Σε αυτή την περίπτωση, το toPrecision(3) είναι ίσο με το toFixed(1), εκτυπώνει "68.0".

Οι μεθόδους toFixed(), toExponential() και toPrecision() εκτελούν ρύθμιση ζήτησης για να εκτυπώσουν έναν αριθμό με την σωστή αριθμητική ακρίβεια με το σωστό αριθμό των δεκαδικών.

Συμβουλή:Καθώς και το αντικείμενο Boolean, το αντικείμενο Number είναι πολύ σημαντικό, αλλά θα πρέπει να χρησιμοποιείται λιγότερο για να αποφευχθούν πιθανά προβλήματα. Όταν είναι δυνατόν, χρησιμοποιήστε την αρχική εκδοχή των αριθμών.

Δείτε

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

αντικείμενο String

Το αντικείμενο String είναι η αντικειμενική εκπροσώπηση του τύπου String, το οποίο δημιουργείται με τον παρακάτω τρόπο:

var oStringObject = new String("hello world");

Οι μεθόδους valueOf() και toString() του αντικειμένου String επιστρέφουν την αρχική τιμή του τύπου String:

alert(oStringObject.valueOf() == oStringObject.toString());	//εκτυπώνει "true"

Αν εκτελέσετε αυτό το κώδικα, η έξοδος είναι "true", που σημαίνει ότι αυτές οι τιμές είναι πραγματικά ισότιμες.

Σημειώσεις:Το αντικείμενο String είναι ένα από τα πιο περίπλοκα αναφορικά τύπου στο ECMAScript. Επίσης, το κύριο σημείο αυτού του κεφαλαίου είναι η βασική λειτουργία της κλάσης String. Για περισσότερες προηγμένες λειτουργίες, παρακαλώ διαβάστε τα σχετικά κεφάλαια του εγχειριδίου ή δείτε Εγχειρίδιο αναφοράς του αντικειμένου String του JavaScript.

ιδιότητα length

Το αντικείμενο String έχει την ιδιότητα length, η οποία είναι ο αριθμός των χαρακτήρων στη συμβολοσειρά:

var oStringObject = new String("hello world");
alert(oStringObject.length);	//εκτυπώνει "11"

Αυτός ο παράδειγμα εκτυπώνει "11", δηλαδή ο αριθμός των χαρακτήρων στη "hello world". Λαμβάνοντας υπόψη ότι η συμβολοσειρά περιέχει διγλωσσικούς χαρακτήρες (σε σύγκριση με τους ASCII χαρακτήρες που καταλαμβάνουν μόνο ένα byte), κάθε χαρακτήρας υπολογίζεται ως ένας χαρακτήρας.

charAt() και charCodeAt() μεθόδους

Το αντικείμενο String έχει πολλά άλλα μέθοδους.

Πρώτα απ' όλα, οι μεθόδους charAt() και charCodeAt() προσπερνάνε έναν χαρακτήρα στη συμβολοσειρά. Και οι δύο μεθόδους έχουν έναν παράγοντα, την θέση του χαρακτήρα που θα επεξεργαστεί.

charAt() μέθοδος επιστρέφει μια αλφαβητική αλυσίδα που περιέχει τον χαρακτήρα στην καθορισμένη θέση:

var oStringObject = new String("hello world");
alert(oStringObject.charAt(1));	//εκτυπώνει "e"

Στην αλφαβητική αλυσίδα "hello world", ο χαρακτήρας στην θέση 1 είναι "e" στην ενότητα "ECMAScript Βασικές Τύπους" έχουμε μιλήσει, η θέση του πρώτου χαρακτήρα είναι 0, η θέση του δεύτερου χαρακτήρα είναι 1, και ούτω καθεξής. Επομένως, η charAt(1) επιστρέφει τον "e".

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

var oStringObject = new String("hello world");
alert(oStringObject.charCodeAt(1));	// Εξόδος "101"

Αυτός ο παράδειγμα εκτυπώνει "101", ο χαρακτήρας κώδικα του πεζού "e".

concat() μεθόδους

Συνεχίζοντας με τη concat() μέθοδο, η οποία χρησιμοποιείται για να συνδέσει μια ή περισσότερες αλφαβητικές αλυσίδες στο αρχικό τιμή του String ομπジェκτου. Η μέθοδος αυτή επιστρέφει το αρχικό τιμή του String, διατηρώντας τον αρχικό String ομπジェκτο ανέπαφο:

νέο oStringObject = νέο String("hello ");
νέο sResult = oStringObject.concat("world");
alert(sResult);		// Εξόδος "hello world"
alert(oStringObject);	// Εξόδος "hello "

Σε αυτό το κομμάτι κώδικα, η concat() μέθοδος επιστρέφει "hello world", ενώ ο String ομπジェκτος αποθηκεύει εξακολουθεί να είναι "hello ". Για αυτόν τον λόγο, είναι πιο συχνά να χρησιμοποιούμε το πρόσημο (+) για τη σύνδεση αλφαβητικών αλυσίδων, καθώς αυτή η μορφή δείχνει την πραγματική συμπεριφορά:

νέο oStringObject = νέο String("hello ");
νέο sResult = oStringObject + "world";
alert(sResult);		// Εξόδος "hello world"
alert(oStringObject);	// Εξόδος "hello "

indexOf() και lastIndexOf() μεθόδους

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

Η indexOf() και η lastIndexOf() επιστρέφουν τη θέση του καθορισμένου υποακολουθού σε μια άλλη αλφαβητική αλυσίδα. Αν ο υποακολουθός δεν βρεθεί, επιστρέφεται -1.

Η διαφορά μεταξύ των δύο μεθόδων είναι ότι η indexOf() αρχίζει την αναζήτηση από την αρχή της αλφαβητικής αλυσίδας (στον τοποθέτη 0), ενώ η lastIndexOf() αρχίζει από το τέλος της αλφαβητικής αλυσίδας. Για παράδειγμα:

νέο StringΟ브ジェκτoς = νέο String("hello world!");
alert(oStringObject.indexOf("o"));		έξοδος "4"
alert(oStringObject.lastIndexOf("o"));	έξοδος "7"

Εδώ, η πρώτη "o" συμβολοσειρά βρίσκεται στη θέση 4, δηλαδή η "o" στην "hello"; Η τελευταία "o" βρίσκεται στη θέση 7, δηλαδή η "o" στην "world". Αν η συμβολοσειρά έχει μόνο μια "o", τότε οι μεθόδους indexOf() και lastIndexOf() επιστρέφουν την ίδια θέση.

Μέθοδος localeCompare()

Η επόμενη μέθοδος είναι η localeCompare(), που σειρώνει τις συμβολοσειρές. Αυτή η μέθοδος έχει έναν παράμετρο - τη συμβολοσειρά που πρέπει να συγκριθεί, και επιστρέφει μια από τις τρεις τιμές παρακάτω:

  • Αν το αντικείμενο String είναι ταξινομημένο πριν την αλφαβητική σειρά από τη συμβολοσειρά του παραμέτρου, επιστρέφει αρνητικό αριθμό.
  • Αν το αντικείμενο String είναι ίσο με τη συμβολοσειρά του παραμέτρου, επιστρέφει 0
  • Αν το αντικείμενο String είναι ταξινομημένο μετά την αλφαβητική σειρά από την συμβολοσειρά του παραμέτρου, επιστρέφει θετικό αριθμό.

Σημειώσεις:Αν επιστρέψει αρνητικό αριθμό, ο πιο συνηθισμένος είναι -1, αλλά αυτό που επιστρέφεται είναι από την υλοποίηση. Αν επιστρέψει θετικό αριθμό, όπως και στην περίπτωση των θετικών αριθμών, ο πιο συνηθισμένος είναι 1, αλλά αυτό που επιστρέφεται είναι από την υλοποίηση.

Ένα παράδειγμα είναι ως εξής:

var oStringObject = new String("yellow");
alert(oStringObject.localeCompare("brick"));		//έξοδος "1"
alert(oStringObject.localeCompare("yellow"));		//έξοδος "0"
alert(oStringObject.localeCompare("zoo"));		//έξοδος "-1"

Σε αυτό το κώδικα, η συμβολοσειρά "yellow" συγκρίνεται με τρεις τιμές, δηλαδή "brick", "yellow" και "zoo". Επειδή είναι ταξινομημένα κατά φθίνουσα αλφαβητική σειρά, η "yellow" βρίσκεται μετά τη "brick", οπότε η localeCompare() επιστρέφει 1; Η "yellow" είναι ίση με την ίδια, οπότε η localeCompare() επιστρέφει 0; Η "zoo" βρίσκεται μετά τη "yellow", οπότε η localeCompare() επιστρέφει -1. Πρέπει να επαναλάβω, επειδή η επιστροφή των τιμών εξαρτάται από την υλοποίηση, είναι καλύτερο να καλείτε τη μέθοδο localeCompare() με τον παρακάτω τρόπο:

var oStringObject1 = new String("yellow");
var oStringObject2 = new String("brick");
var iResult = oStringObject1.localeCompare(oStringObject2);
if(iResult < 0) {
  alert(oStringObject1 + " έρχεται πριν από " + oStringObject2);
}
  alert(oStringObject1 + " έρχεται μετά από " + oStringObject2);
}
  alert("Οι δύο strings είναι ίσοι");
}

Με αυτή τη δομή, μπορεί να διασφαλιστεί ότι αυτό το κώδικας θα εκτελείται σωστά σε όλες τις υλοποιήσεις.

Η μοναδικότητα της μεθόδου localeCompare() βρίσκεται στο γεγονός ότι η περιοχή (locale, που αναφέρεται και στην περιοχή/γλώσσα) που υλοποιείται καθορίζει με ακρίβεια τον τρόπο λειτουργίας αυτής της μεθόδου. Στις Ηνωμένες Πολιτείες, η αγγλική γλώσσα είναι η πρότυπη γλώσσα της υλοποίησης του ECMAScript, και η localeCompare() είναι διακριτική σε κεφαλαία και μικρά γράμματα, με τα κεφαλαία γράμματα να βρίσκονται μετά από τα μικρά γράμματα στη σειρά των γραμμάτων. Ωστόσο, σε άλλες περιοχές, η κατάσταση μπορεί να μην είναι έτσι.

slice() και substring()

Το ECMAScript παρέχει δύο μεθόδους για τη δημιουργία τιμών字符串 από υποстрings, δηλαδή slice() και substring(). Και οι δύο μεθόδους επιστρέφουν υποstrings που πρέπει να χειριστούν, και δέχονται έναν ή δύο παραμέτρους. Η πρώτη παράμετρος είναι η θέση ξεκινήματος του υποstrings που πρέπει να αποκτηθεί, και η δεύτερη παράμετρος (αν χρησιμοποιείται) είναι η θέση που πρέπει να σταματήσει η απόκτηση του υποstrings (δηλαδή, η θέση που πρέπει να αποκτηθεί δεν περιλαμβάνεται στη επιστροφή της τιμής). Αν παραλειφθεί η δεύτερη παράμετρος, η θέση τελεσίδικη είναι η μήκος του strings.

Καθώς και η μέθοδος concat(), οι μεθόδοι slice() και substring() δεν αλλάζουν την τιμή του αντικειμένου String. Εκδίδουν μόνο την αρχική τιμή του String, διατηρώντας το αντικείμενο String αμετάβλητο.

var oStringObject = new String("hello world");
alert(oStringObject.slice("3"));		//Εκτυπώνει το "lo world"
alert(oStringObject.substring("3"));		//Εκτυπώνει το "lo world"
alert(oStringObject.slice("3", "7"));		//Εκτυπώνει το "lo w"
alert(oStringObject.substring("3", "7"));	//Εκτυπώνει το "lo w"

Σε αυτό το παράδειγμα, η χρήση των συναρτήσεων slice() και substring() είναι η ίδια και οι τιμές που επιστρέφουν είναι οι ίδιες. Όταν υπάρχει μόνο ο παραμέτρος 3, και οι δύο λειτουργίες επιστρέφουν το "lo world", επειδή το δεύτερο "l" στη λέξη "hello" βρίσκεται στην poz 3. Όταν υπάρχουν δύο παραμέτρους "3" και "7", και οι δύο λειτουργίες επιστρέφουν το "lo w" (το γράμμα "o" στη λέξη "world" βρίσκεται στην poz 7, οπότε δεν περιλαμβάνεται στη διαφορά).

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

Για αρνητικούς αριθμούς παραμέτρους, η συνάρτηση slice() προσθέτει τον αριθμό της συμβολοσειράς στον παραμέτρο, ενώ η συνάρτηση substring() την θεωρεί ως 0 (δηλαδή την αγνοεί). Για παράδειγμα:

var oStringObject = new String("hello world");
alert(oStringObject.slice("-3"));		//Εκτυπώνει το "rld"
alert(oStringObject.substring("-3"));	//Εκτυπώνει το "hello world"
alert(oStringObject.slice("3, -4"));		//Εκτυπώνει το "lo w"
alert(oStringObject.substring("3, -4"));	//Εκτυπώνει το "hel"

Με αυτόν τον τρόπο μπορείτε να δείτε τις κύριες διαφορές μεταξύ των συναρτήσεων slice() και substring().

Εάν υπάρχει μόνο ο παράμετρος -3, η συνάρτηση slice() επιστρέφει το "rld", ενώ η συνάρτηση substring() επιστρέφει το "hello world". Αυτό οφείλεται στο γεγονός ότι για τη συμβολοσειρά "hello world", η slice("-3") μετατρέπεται σε slice("8"), ενώ η substring("-3") μετατρέπεται σε substring("0").

Επίσης, όταν χρησιμοποιούνται οι παράμετροι 3 και -4, οι διαφορές είναι εμφανείς. Η slice() μετατρέπεται σε slice(3, 7), όπως και στο προηγούμενο παράδειγμα, και επιστρέφει "lo w". Η μέθοδος substring() θα εξηγήσει τους δύο παραμέτρους ως substring(3, 0), δηλαδή substring(0, 3), επειδή η substring() πάντα χρησιμοποιεί τον μικρότερο αριθμό ως σημείο έναρξης και τον μεγαλύτερο αριθμό ως σημείο λήξης. Επομένως, substring("3, -4") επιστρέφει "hel". Η τελευταία γραμμή κώδικα χρησιμοποιείται για να εξηγήσει πώς να χρησιμοποιηθούν αυτές οι μεθόδους.

toLowerCase(), toLocaleLowerCase(), toUpperCase() και toLocaleUpperCase()

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

  • toLowerCase()
  • toLocaleLowerCase()
  • toUpperCase()
  • toLocaleUpperCase()

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

Η μέθοδος toLowerCase() και η μέθοδος toUpperCase() είναι πρωτότυπες, και υλοποιούνται με βάση τις ίδιες μεθόδους του java.lang.String.

Η μέθοδος toLocaleLowerCase() και η μέθοδος toLocaleUpperCase() είναι βασισμένες σε συγκεκριμένες περιοχές (όπως και η μέθοδος localeCompare()). Σε πολλές περιοχές, οι περιοχικές μεθόδους είναι πλήρως ίδιες με τις γενικές μεθόδους. Ωστόσο, μερικές γλώσσες εφαρμόζουν συγκεκριμένες κανόνες για τη μετατροπή μεγέθους των χαρακτήρων Unicode (π.χ. το Τουρκικό), οπότε πρέπει να χρησιμοποιηθούν οι περιοχικές μεθόδους για να γίνει η σωστή μετατροπή.

var oStringObject = new String("Hello World");
alert(oStringObject.toLocaleUpperCase());	// εκτυπώνει "HELLO WORLD"
alert(oStringObject.toUpperCase());		// εκτυπώνει "HELLO WORLD"
alert(oStringObject.toLocaleLowerCase());	// εκτυπώνει "hello world"
alert(oStringObject.toLowerCase());		// Έξοδος "hello world"

Σε αυτόν τον κώδικα, η toUpperCase() και η toLocaleUpperCase() εκτυπώνουν και οι δύο "HELLO WORLD", ενώ η toLowerCase() και η toLocaleLowerCase() εκτυπώνουν και οι δύο "hello world". Συνήθως, αν δεν γνωρίζετε σε ποια κωδικοποίηση εκτελείται μια γλώσσα, η χρήση των τοπικών μεθόδων είναι πιο ασφαλής.

Συμβουλή:Μην ξεχνάτε ότι όλες οι ιδιότητες και οι μεθόδοι του αντικειμένου String μπορούν να εφαρμοστούν στην αρχική τιμή String, επειδή είναι ψευδοαντικείμενα.

Ο διαγωνιστής instanceof

Όταν χρησιμοποιείται ο διαγωνιστής typeof με τύπους αναφοράς, μπορεί να προκύψει ένα πρόβλημα, καθώς ανεξάρτητα από τον τύπο του αντικειμένου, επιστρέφει "object". Το ECMAScript εισήγαγε έναν άλλο διαγωνιστή Java instanceof για να λύσει αυτό το πρόβλημα.

Ο διαγωνιστής instanceof είναι παρόμοιος με τον διαγωνιστή typeof, και χρησιμοποιείται για να αναγνωρίσει τον τύπο του αντικειμένου που χειρίζεται. Αν διαφέρει από τη μέθοδο typeof, η μέθοδος instanceof απαιτεί τους προγραμματιστές να επιβεβαιώσουν ρητά ότι το αντικείμενο είναι του συγκεκριμένου τύπου. Για παράδειγμα:

var oStringObject = new String("hello world");
alert(oStringObject instanceof String);	// Έξοδος "true"

Το κείμενο αυτού του κώδικα ερωτά αν ο μεταβλητός oStringObject είναι παράδειγμα του αντικειμένου String. Ο oStringObject είναι πράγματι παράδειγμα του αντικειμένου String, οπότε το αποτέλεσμα είναι "true". Αν και δεν είναι τόσο ευέλικτος όπως η μέθοδος typeof, η μέθοδος instanceof είναι πολύ χρήσιμη όταν η μέθοδος typeof επιστρέφει "object".