
Per chi non lo sapesse ES6 o ufficialmente ECMAScript2015 è l’ultima implementazione del noto linguaggio di programmazione Javascript. Vista la crescente diffusione nell’uso di questo linguaggio e l’ evoluzione che lo ha trasformato da un linguaggio prettamente per il web o meglio un linguaggio che funzionava solo all’interno di un browser web, in un linguaggio general purpose conoscere le nuove e importanti caratteristiche introdotte in quest’ultima versione è una cosa che giova molto a tutti i programmatori: D’altronde chi non ha mai usato javascript in una propria applicazione?
Un minimo di storia
- 1995: nasce JavaScript ma il suo nome è LiveScript
- 1997: Nasce lo standard ECMAScript
- 1999: Nasce ES3 e IE5 è il browser maggiormente in voga
- 2000–2005: l’uso dell’oggetto XMLHttpRequest, meglio conosciuto come AJAX, che consente comunicazioni asincrone, si diffonde rapidamente con la nascita di applicazioni come Outlook Web Access (2000), Gmail (2004) e Google Maps (2005).
- 2009: Esce ES5 (attualmente la versione più usata e più supportata) con istruzioni come:
forEach
,Object.keys
,Object.create
e lo standard JSON - 2015: Nasce ES6/ECMAScript2015 con tantissime migliorie. Alcune delle più importati saranno descritte di seguito
Adesso vediamo 10 delle nuove caratteristiche introdotte in ES6:
1. Valori di default dei parametri
ES5
1 2 3 4 5 6 7 8 9 | function f (x, y, z) { if (x === undefined) x = 0; if (y === undefined) y = 7; if (z === undefined) z = 42; return x + y + z; }; |
ES6
1 2 3 | function f (x=0, y = 7, z = 42) { return x + y + z } |
2. Interpolazione di stringhe
ES5
1 2 | var ws = ' Benvenuto ' + first + ' ' + last + '.' |
ES6
1 2 | var ws= `Benvenuto ${first} ${last}.` var url = `http: //localhost:8080/api/user/${id}` |
3. Stringhe multilinea
ES5
1 2 3 | var poema = 'Nel mezzo del cammin di nostra vita\n\t' + 'mi ritrovai per una selva oscura,\n\t' + 'ché la diritta via era smarrita.' ; |
ES6
1 2 3 | var poema = 'Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, ché la diritta via era smarrita.' ; |
4. Assegnamenti destrutturati
destrutturazione intuitiva e flessibile di oggetti e array in singole variabili durante l’assegnazione.
ES5
1 2 3 4 5 6 7 | var user = getUser(); // user è un oggetto che ha il campi nome, cognome e nickname var nome = user.nome; var cognome = user.cognome; var nick = user.nickname; var list = [ 1, 2, 3 ]; var a = list[0], b = list[2]; |
ES6
1 2 3 4 | var { nome, cognome, nick} = getUser(); var list = [ 1, 2, 3 ]; var [ a, , b ] = list; |
5. Notazione più semplice delle proprietà degli oggetti e dei metodi
ES5
1 2 3 4 5 6 7 8 9 10 11 | obj = { x: x, y: y }; obj = { foo: function (a, b) { … }, bar: function (x, y) { … }, // quux: no equivalent in ES5 … }; |
ES6
1 2 3 4 5 6 7 8 9 10 11 12 | obj = { x, y }; obj = { foo (a, b) { … }, bar (x, y) { … }, *quux (x, y) { … } } |
6. Funzioni freccia
ES5
1 | const squares = arr.map( function (x) { return x * x }); |
ES6
1 | const squares = arr.map(x => x * x); |
7. Promises
ES5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | function isGreater (a, b, cb) { var greater = false if (a > b) { greater = true } cb(greater) } isGreater(1, 2, function (result) { if (result) { console.log( 'greater' ); } else { console.log( 'smaller' ) } }) |
ES6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | const isGreater = (a, b) => { return new Promise ((resolve, reject) => { if (a > b) { resolve( true ) } else { reject( false ) } }) } isGreater(1, 2) .then(result => { console.log( 'greater' ) }) . catch (result => { console.log( 'smaller' ) }) |
Le Promises di ES6 ci consentono di risolvere (resolve) e respingere (reject) una richiesta. Ogni volta che risolviamo una richiesta chiameremo la callback indicata nel then e ogni volta che rifiuteremo una richiesta chiameremo la callback della catch.
Le Promises ES6 sono migliori delle callback perché ci permettono di distinguere facilmente tra un successo e un errore, quindi non dobbiamo controllare di nuovo le cose nella nostra funzione di callback.
8. Export ed import di moduli
ES5
1 2 3 4 5 6 | // Export var myModule = { x: 1, y: function (){ console.log( 'This is ES5' ) }} module.exports = myModule; // Import var myModule = require( './myModule' ); |
ES6
1 2 3 4 5 6 | //Export const myModule = { x: 1, y: () => { console.log( 'This is ES5' ) }} export default myModule; // Import import myModule from './myModule' ; |
9. Classi
Notazione delle Classi più intuitiva in stile OOP e priva di codice boilerplate
Definizione delle Classi
ES5
1 2 3 4 5 6 7 8 9 | var Shape = function (id, x, y) { this .id = id; this .move(x, y); }; Shape.prototype.move = function (x, y) { this .x = x; this .y = y; }; |
ES6
1 2 3 4 5 6 7 8 9 10 11 12 | class Shape { constructor (id, x, y) { this .id = id this .move(x, y) } move (x, y) { this .x = x this .y = y } } |
Ereditarietà
ES5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | var Rectangle = function (id, x, y, width, height) { Shape.call( this , id, x, y); this .width = width; this .height = height; }; Rectangle.prototype = Object.create(Shape.prototype); Rectangle.prototype.constructor = Rectangle; var Circle = function (id, x, y, radius) { Shape.call( this , id, x, y); this .radius = radius; }; Circle.prototype = Object.create(Shape.prototype); Circle.prototype.constructor = Circle; |
ES6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | class Rectangle extends Shape { constructor (id, x, y, width, height) { super (id, x, y) this .width = width this .height = height } } class Circle extends Shape { constructor (id, x, y, radius) { super (id, x, y) this .radius = radius } } |
10. Scope a livello di Blocco
Variabili
ES5
1 2 3 4 5 6 7 8 9 10 | var i, x, y; for (i = 0; i < a.length; i++) { x = a[i]; … } for (i = 0; i < b.length; i++) { y = b[i]; … } |
ES6
1 2 3 4 5 6 7 8 9 | for (let i = 0; i < a.length; i++) { let x = a[i] … } for (let i = 0; i < b.length; i++) { let y = b[i] … } |
Funzioni
ES5
1 2 3 4 5 6 7 8 9 | ( function () { var foo = function () { return 1; } foo() === 1; ( function () { var foo = function () { return 2; } foo() === 2; })(); foo() === 1; })(); |
ES6
1 2 3 4 5 6 7 8 9 | { function foo () { return 1 } foo() === 1 { function foo () { return 2 } foo() === 2 } foo() === 1 } |