var vs let
let è block scoped mentre var è function scoped
const: mutabilità vs immutabilità
const è block scoped come let e in più le variabili const non possono essere riassegnate. Questo non significa che una variabile const non possa mutare:
Template literals: stringhe multiline e con espressioni
Grazie a questa nuova sintassi risulta più comodo creare stringhe multiline o meno con al loro interno delle variabili.
Short object syntax
Nel momento in cui chiave e valore di un oggetto coincidono posso omettere uno dei due:
Destructuring
Serve per estrarre dagli oggetti/array dei valori o delle proprietà creando nuove variabili che conterrano tali valori.
Destructuring di nested props
Si può usare il destructuring anche su oggetti con diversi nodi al suo interno:
Spread operator
Lo spread operator è una nuova sintassi di ES6 che permette di clonare, mergiare e modificare gli array.
Dietro le quinte tramite babel lo spread operator diventa un concat in ES5
Object spread operator vs Object.assign
Entrambe le sintassi servono per creare un clone, anzi si può dire che lo spread operator sia zucchero sintattico per fare una Object.assign:
Arrow function
La sintassi delle arrow function è più compatta e da dei vantaggi a livello di this
che vedremo più avanti:
Array: map
ES6 fornisce una nuova serie di metodi per lavorare gli array: map in particolare ci permette di creare una nuova collezione a partire da un array.
Possiamo anche avere traccia dell’indice dell’elemento che si stà processando mettendo un secondo parametro dopo user
Array: filter
Crea un array partendo da un altro array andando a capire tramite un predicato (una funzione passata come argomento) se l’elemento deve essere presente o meno nel nuovo array.
Array: find e findIndex
findIndex permette tramite una funzione di andare a recuperare l’indice di un elemento della collezione, mentre find restituisce l’oggetto.
Immutabilità in ES6
Classi, Ereditarietà e lexical this
Il concetto di classe è stato introdotto da ES6, naturalmente con babel in transpilazione ad ES5 le classi vengono tradotte in funzioni
Per ovviare al problema del this nelle funzioni un’altro metodo valido è usare
.bind(this)
ES6: import modules e type=“module”
i moduli non sono nient’altro che file js con però il contesto del file isolato dal resto
import default
Promises
Le promise ci permettono di risolvere il problema delle callback hell semplificando il codice. Le promise sono un intermediario tra la parte sincrona ed asincrona del nostro codice. Una promise può essere vista come un contenitore non dipendente dal tempo, si possono impostare in modo asincrono degli osservatori che tengono d’occhio il contenitore i quali riceveranno un valore appena disponibile.
async await snelliscono la sintassi e spesso sono preferibili
Typescript: cos’è
typescript è un superset di js permette di tipizzare il codice, ad esempio creando una variabile String non potremo assegnargli un valore intero. Ha uno static type system, ovvero già in fase di compilazione verifica se il tipo di dato è conforme al tipo della variabile
Inferenza in typescript
L’inferenza (in typescript come in altri linguaggi come dart) è la capacità di generare un tipo di una variabile partendo da un valore iniziale.
Tipizzare oggetti usando interface e gestione proprietà opzionali
Utilizzo di class e type per la tipizzazione
Ci sono altre 2 possibilità per definire un tipo di dato:
class
type
Quando usare uno o l’altro? Quando possibile usare le interface, anche perchè in fase di compilazione non pesano niente. Le classi hanno il vantaggio di poter essere usate con il paradigma ad oggetti (posso fare new Class) ma ogni istanza occuperà più memoria e le classi, convertite in funzioni occuperanno comunque di più.
type invece può essere utile per combinare diversi tipi di dato insieme come union intersections ecc.
getter & setter
Molto spesso si tende ad evitare setter e getter in favore di public per avere un codice più coinciso e leggibile. (ma la soluzione più indicata sarebbero i getter & setter).