Μια γρήγορη επισκόπηση των συμβόλων JavaScript

Σύμβολα

Τα σύμβολα είναι νέα πρωτόγονατύπος που εισήχθη στο ES6. Τα σύμβολα είναι εντελώς μοναδικά αναγνωριστικά. Ακριβώς όπως τα πρωτόγονα αντίστοιχά τους ( Number , String , Boolean ), μπορούν να δημιουργηθούν χρησιμοποιώντας την εργοστασιακή λειτουργία Symbol()που επιστρέφει ένα Σύμβολο.

const symbol = Symbol('description')

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

> symbol Symbol(description)

Κάθε σύμβολο που επιστρέφεται Symbol()είναι μοναδικό, επομένως κάθε σύμβολο έχει τη δική του ταυτότητα:

> Symbol() === Symbol() false

Μπορείτε να δείτε ότι τα σύμβολα είναι πρωτόγονα εάν εφαρμόσετε τον typeofτελεστή σε ένα από αυτά - θα επιστρέψει ένα νέο αποτέλεσμα για συγκεκριμένο σύμβολο:

> typeof symbol 'symbol'

Use Case: Σύμβολα ως κλειδιά μη δημόσιων ιδιοτήτων

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

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

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

Για παράδειγμα, στον ακόλουθο κώδικα, τα σύμβολα χρησιμοποιούνται για ιδιωτικές ιδιότητες _counterκαι _action:

const _counter = Symbol('counter'); const _action = Symbol('action'); class Countdown { constructor(counter, action) { this[_counter] = counter; this[_action] = action; } dec() { let counter = this[_counter]; if (counter < 1) return; counter--; this[_counter] = counter; if (counter === 0) { this[_action](); } } }

Λάβετε υπόψη ότι τα σύμβολα σας προστατεύουν μόνο από συγκρούσεις ονόματος και όχι από μη εξουσιοδοτημένη πρόσβαση. Μπορείτε να βρείτε όλα τα κλειδιά ιδιοτήτων ενός αντικειμένου - συμπεριλαμβανομένων των συμβόλων - μέσω των εξής:

const obj = { [Symbol('my_key')] : 1, enum : 2, nonEnum : 3 }; Object.defineProperty(obj, 'nonEnum', { enumerable: false }); // Making 'nonEnum' as not enumerable. // Ignores symbol-valued property keys: > Object.getOwnPropertyNames(obj) ['enum', 'nonEnum'] // Ignores string-valued property keys: > Object.getOwnPropertySymbols(obj) [Symbol(my_key)] // Considers all kinds of keys: > Reflect.ownKeys(obj) [Symbol(my_key),'enum', 'nonEnum'] // Only considers enumerable property keys that are strings: > Object.keys(obj) ['enum']

Χρειαζόμαστε πραγματικά σύμβολα;

Χρησιμοποιήστε σύμβολα όταν η απαίτησή σας είναι μία από αυτές:

  • Enum: Για να μπορέσετε να ορίσετε σταθερές με σημασιολογικά ονόματα και μοναδικές τιμές.
const directions = { UP : Symbol( ‘UP’ ), DOWN : Symbol( ‘DOWN’ ), LEFT : Symbol( ‘LEFT’ ), RIGHT: Symbol( ‘RIGHT’ ) };
  • Όνομα συγκρούσεις: όταν θέλετε να αποφύγετε συγκρούσεις με κλειδιά σε αντικείμενα
  • Απόρρητο: όταν δεν θέλετε να είναι μετρήσιμα οι ιδιότητες του αντικειμένου σας
  • Πρωτόκολλα: Για να ορίσετε πώς μπορεί να επαναληφθεί ένα αντικείμενο.

    Φανταστείτε, για παράδειγμα, μια βιβλιοθήκη σαν να dragulaορίζετε ένα πρωτόκολλο Symbol.for(dragula.moves). Μπορείτε να προσθέσετε μια μέθοδο σε αυτό Symbolσε οποιοδήποτε στοιχείο DOM. Εάν ένα στοιχείο DOM ακολουθεί το πρωτόκολλο, τότε dragulaθα μπορούσε να καλέσει τη el[Symbol.for('dragula.moves')]()μέθοδο που καθορίζεται από το χρήστη για να επιβεβαιώσει εάν το στοιχείο μπορεί να μετακινηθεί.

  • Γνωστά σύμβολα: Εκτός από τα καθορισμένα από το χρήστη σύμβολα, το JavaScript έχει μερικά ενσωματωμένα σύμβολα. Αυτά αντιπροσωπεύουν συμπεριφορές εσωτερικής γλώσσας που δεν εκτέθηκαν σε προγραμματιστές σε <ES5. Περισσότερες πληροφορίες εδώ .

συμπέρασμα

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

code = coffee + developer