ES2018: Οι νέες δυνατότητες του Javascript το 2018

Οι φίλοι μας από το TC39 έχουν κυκλοφορήσει νέες ενημερώσεις για την αγαπημένη μας γλώσσα JavaScript.

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

  • Στάδιο 0: Strawman - Να επιτρέπεται η είσοδος στις προδιαγραφές
  • Στάδιο 1: Πρόταση - Κάντε την υπόθεση για την προσθήκη. Περιγράψτε το σχήμα μιας λύσης. Προσδιορίστε πιθανές προκλήσεις
  • Στάδιο 2: Πρόχειρο - Περιγράψτε με ακρίβεια τη σύνταξη και τη σημασιολογία χρησιμοποιώντας επίσημη γλώσσα προδιαγραφών
  • Στάδιο 3: Υποψήφιος - Υποδείξτε ότι η περαιτέρω βελτίωση θα απαιτήσει ανατροφοδότηση από εφαρμογές και χρήστες
  • Στάδιο 4: Ολοκληρώθηκε - Υποδείξτε ότι η προσθήκη είναι έτοιμη για συμπερίληψη στο επίσημο πρότυπο ECMAScript

Περισσότερες λεπτομέρειες μπορείτε να δείτε εδώ. Αν θέλετε να μάθετε περισσότερα σχετικά με τις προηγούμενες αλλαγές, ρίξτε μια ματιά στα ES6, ES7 και ES8.

Ας δούμε λοιπόν τι έχουν προσθέσει ή ενημερώσει τον τελευταίο χρόνο:

1. Πολλές αλλαγές στο Regex

Έχουμε τέσσερις τροποποιήσεις για το regex. Ας τα δούμε:

s( dotAll) σημαία για κανονικές εκφράσεις

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

/hello.bye/.test('hello\nbye') // prints false

Η λύση είναι η νέα σημαία (από singleline):

/hello.bye/s.test('hello\nbye') // prints true

RegExp ονόματα ομάδων σύλληψης

Αυτός είναι ο παλιός τρόπος λήψης του έτους, του μήνα και της ημέρας από μια ημερομηνία:

const REGEX = /([0-9]{4})-([0-9]{2})-([0-9]{2});const results = REGEX.exec('2018-07-12');console.log(results[1]); // prints 2018console.log(results[2]); // prints 07console.log(results[3]); // prints 12

Και αν εργάζεστε με ένα μακρύ regex, γνωρίζετε πόσο δύσκολο είναι να παρακολουθείτε τις ομάδες, τις παρενθέσεις και τους δείκτες. Με τη νέα ονομαστική ομάδα σύλληψης, μπορείτε:

const REGEX = /(?[0-9]{4})-(?[0-9]{2})-(?[0-9]{2});const results = REGEX.exec('2018-07-12');console.log(results.groups.year); // prints 2018console.log(results.groups.month); // prints 07console.log(results.groups.day); // prints 12

RegExp Κοιτάξτε πίσω από τους ισχυρισμούς

Υπάρχουν δύο εκδοχές πίσω από τους ισχυρισμούς: θετικό και αρνητικό

α) Θετικό (? < =…)

'$foo #foo @foo'.replace(/(?<=#)foo/g, 'XXX')// prints $foo #XXX @foo

Αυτό το (?<=#)foregex o / g λέει ότι η λέξη πρέπει να ξεκινά με # και δεν συμβάλλει στη συνολική αντιστοιχισμένη συμβολοσειρά (οπότε δεν θα αντικαταστήσει τον χαρακτήρα #).

β) Αρνητικό (? < !…)

'$foo #foo @foo'.replace(/(?
    

On the contrary, this assertion guarantees that it doesn't start with #.

RegExp Unicode Property Escapes

Now we can search for characters by mentioning their Unicode character property inside of \p{}

/\p{Script=Greek}/u.test('μ') // prints true

You can check out more of the properties by clicking here.

2. Rest/Spread Properties

The rest operator (...) copies the remaining property keys that were not mentioned. Let's look at an example:

const values = {a: 1, b: 2, c: 3, d: 4};const {a, ...n} = values;console.log(a); // prints 1console.log(n); // prints {b: 2, c: 3, d: 4}

3. Promise.prototype finally

This new callback will always be executed, if catch was called or not.

fetch('//website.com/files').then(data => data.json()).catch(err => console.error(err)).finally(() => console.log('processed!'))

4. Asynchronous Iteration

Finally!

Now we can use await on our loops declarations.

for await (const line of readLines(filePath)) { console.log(line);}

And these are all the changes from this year. Let’s wait to see what they will bring us next year.

If you enjoyed this article, be sure to like it give me a lot of claps — it means the world to the writer ? And follow me if you want to read more articles about Culture, Technology, and Startups.

Flávio H. de Freitas is an Entrepreneur, Engineer, Tech lover, Dreamer and Traveler. Has worked as CTO in Brazil, Silicon Valley and Europe.