0%
JavaScript Moderne : Les fonctionnalités ES6+

JavaScript Moderne : Les fonctionnalités ES6+

Découvrez les fonctionnalités modernes de JavaScript qui ont révolutionné le développement web.

I

InSkillCoach

· min

JavaScript Moderne : Les fonctionnalités ES6+

Depuis 2015, JavaScript a connu une évolution majeure avec l’introduction d’ECMAScript 2015 (ES6) et les versions suivantes. Ces mises à jour ont apporté de nombreuses fonctionnalités qui rendent le code plus propre, plus expressif et plus puissant.

Les principales fonctionnalités d’ES6+

1. Let et Const

Avant ES6, les variables étaient déclarées avec var, qui présentait des problèmes de portée. ES6 a introduit let et const :

// let : variable modifiable avec portée de bloc
let compteur = 0;
compteur = 1; // OK

// const : constante non réassignable
const PI = 3.14159;
// PI = 3.14; // Erreur !

// Portée de bloc
if (true) {
  let x = 10;
  const y = 20;
  var z = 30;
}
// console.log(x); // Erreur : x n'est pas défini
// console.log(y); // Erreur : y n'est pas défini
console.log(z); // 30 (var n'a pas de portée de bloc)

2. Arrow Functions (Fonctions fléchées)

Les fonctions fléchées offrent une syntaxe plus concise et maintiennent le contexte this :

// Fonction classique
function addition(a, b) {
  return a + b;
}

// Fonction fléchée équivalente
const additionFleche = (a, b) => a + b;

// Avec un seul paramètre, les parenthèses sont optionnelles
const carre = x => x * x;

// Avec un corps de fonction plus complexe
const calculer = (a, b) => {
  const resultat = a * b;
  return resultat + 5;
};

// Préservation du contexte this
const personne = {
  nom: "Alice",
  amis: ["Bob", "Charlie"],
  
  // Avec fonction classique
  afficherAmisClassique: function() {
    this.amis.forEach(function(ami) {
      console.log(this.nom + " connaît " + ami); // Erreur : this.nom est undefined
    });
  },
  
  // Avec fonction fléchée
  afficherAmisFleche: function() {
    this.amis.forEach(ami => {
      console.log(this.nom + " connaît " + ami); // Fonctionne correctement
    });
  }
};

3. Template Literals (Littéraux de gabarits)

Les template literals permettent d’intégrer des expressions dans les chaînes de caractères :

const nom = "Alice";
const age = 30;

// Avant ES6
const message1 = "Bonjour, je m'appelle " + nom + " et j'ai " + age + " ans.";

// Avec template literals
const message2 = `Bonjour, je m'appelle ${nom} et j'ai ${age} ans.`;

// Chaînes multi-lignes
const html = `
<div>
  <h1>Profil</h1>
  <p>Nom: ${nom}</p>
  <p>Âge: ${age}</p>
</div>
`;

// Tagged templates
function highlight(strings, ...values) {
  return strings.reduce((result, str, i) => {
    return result + str + (values[i] ? `<strong>${values[i]}</strong>` : '');
  }, '');
}

const messageHighlight = highlight`Bonjour, je m'appelle ${nom} et j'ai ${age} ans.`;
// "Bonjour, je m'appelle <strong>Alice</strong> et j'ai <strong>30</strong> ans."

4. Destructuring (Déstructuration)

La déstructuration permet d’extraire des valeurs des tableaux et des objets :

// Déstructuration d'objets
const utilisateur = {
  nom: "Dupont",
  prenom: "Jean",
  age: 30,
  adresse: {
    ville: "Paris",
    codePostal: "75001"
  }
};

const { nom, prenom, age } = utilisateur;
console.log(nom); // "Dupont"

// Avec alias
const { nom: nomFamille, prenom: prenomUtilisateur } = utilisateur;
console.log(nomFamille); // "Dupont"

// Valeurs par défaut
const { pays = "France" } = utilisateur;
console.log(pays); // "France"

// Déstructuration imbriquée
const { adresse: { ville } } = utilisateur;
console.log(ville); // "Paris"

// Déstructuration de tableaux
const couleurs = ["rouge", "vert", "bleu"];
const [premiere, deuxieme, troisieme] = couleurs;
console.log(premiere); // "rouge"

// Ignorer des éléments
const [, , derniere] = couleurs;
console.log(derniere); // "bleu"

// Rest pattern
const [premier, ...reste] = couleurs;
console.log(reste); // ["vert", "bleu"]

// Échange de variables
let a = 5;
let b = 10;
[a, b] = [b, a];
console.log(a, b); // 10 5

5. Spread Operator (Opérateur de décomposition)

L’opérateur spread (...) permet de décomposer des tableaux et des objets :

// Avec des tableaux
const nombres1 = [1, 2, 3];
const nombres2 = [4, 5, 6];

// Concaténation
const tousLesNombres = [...nombres1, ...nombres2];
console.log(tousLesNombres); // [1, 2, 3, 4, 5, 6]

// Copie d'un tableau
const copieNombres = [...nombres1];

// Avec des objets (ES2018+)
const personne = { nom: "Dupont", age: 30 };
const employe = { ...personne, poste: "Développeur", salaire: 45000 };
console.log(employe); // { nom: "Dupont", age: 30, poste: "Développeur", salaire: 45000 }

// Surcharge de propriétés
const personneModifiee = { ...personne, age: 31 };
console.log(personneModifiee); // { nom: "Dupont", age: 31 }

// Avec des fonctions
function somme(a, b, c) {
  return a + b + c;
}

const nombres = [1, 2, 3];
console.log(somme(...nombres)); // 6

6. Default Parameters (Paramètres par défaut)

Les paramètres par défaut permettent de spécifier des valeurs par défaut pour les arguments de fonction :

// Avant ES6
function creerProfil(nom, age, ville) {
  age = age || 30;
  ville = ville || "Paris";
  return { nom, age, ville };
}

// Avec ES6
function creerProfilES6(nom, age = 30, ville = "Paris") {
  return { nom, age, ville };
}

console.log(creerProfilES6("Alice")); // { nom: "Alice", age: 30, ville: "Paris" }
console.log(creerProfilES6("Bob", 25)); // { nom: "Bob", age: 25, ville: "Paris" }
console.log(creerProfilES6("Charlie", undefined, "Lyon")); // { nom: "Charlie", age: 30, ville: "Lyon" }

7. Rest Parameters (Paramètres du reste)

Les paramètres du reste permettent de représenter un nombre indéfini d’arguments sous forme de tableau :

// Avant ES6
function somme() {
  let total = 0;
  for (let i = 0; i < arguments.length; i++) {
    total += arguments[i];
  }
  return total;
}

// Avec ES6
function sommeES6(...nombres) {
  return nombres.reduce((total, nombre) => total + nombre, 0);
}

console.log(sommeES6(1, 2, 3, 4, 5)); // 15

// Combinaison avec des paramètres normaux
function afficherInfos(nom, prenom, ...details) {
  console.log(`Nom: ${nom} ${prenom}`);
  console.log(`Détails: ${details.join(", ")}`);
}

afficherInfos("Dupont", "Jean", "30 ans", "Paris", "Développeur");
// "Nom: Dupont Jean"
// "Détails: 30 ans, Paris, Développeur"

8. Classes

ES6 a introduit une syntaxe de classe plus intuitive pour la programmation orientée objet :

// Définition d'une classe
class Personne {
  // Constructeur
  constructor(nom, age) {
    this.nom = nom;
    this.age = age;
  }
  
  // Méthodes
  saluer() {
    return `Bonjour, je m'appelle ${this.nom} et j'ai ${this.age} ans.`;
  }
  
  // Méthodes statiques
  static creerPersonneAnonymous() {
    return new Personne("Anonyme", 0);
  }
  
  // Getters et setters
  get nomComplet() {
    return this.nom;
  }
  
  set nomComplet(valeur) {
    this.nom = valeur;
  }
}

// Héritage
class Employe extends Personne {
  constructor(nom, age, poste) {
    super(nom, age); // Appel du constructeur parent
    this.poste = poste;
  }
  
  saluer() {
    return `${super.saluer()} Je suis ${this.poste}.`;
  }
}

// Utilisation
const alice = new Personne("Alice", 30);
console.log(alice.saluer()); // "Bonjour, je m'appelle Alice et j'ai 30 ans."

const bob = new Employe("Bob", 35, "Développeur");
console.log(bob.saluer()); // "Bonjour, je m'appelle Bob et j'ai 35 ans. Je suis Développeur."

9. Modules

ES6 a standardisé les modules JavaScript :

// math.js
export const PI = 3.14159;

export function carre(x) {
  return x * x;
}

export default function somme(a, b) {
  return a + b;
}

// main.js
import somme, { PI, carre } from './math.js';

console.log(PI); // 3.14159
console.log(carre(4)); // 16
console.log(somme(2, 3)); // 5

// Import de tout
import * as math from './math.js';
console.log(math.PI); // 3.14159
console.log(math.carre(4)); // 16
console.log(math.default(2, 3)); // 5

10. Promises et Async/Await

Les Promises et Async/Await simplifient la gestion du code asynchrone :

// Promises
function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const data = { id: 1, nom: "Produit" };
      if (data) {
        resolve(data);
      } else {
        reject("Erreur lors du chargement");
      }
    }, 1000);
  });
}

fetchData()
  .then(data => {
    console.log("Données:", data);
    return data.id;
  })
  .then(id => {
    console.log("ID:", id);
  })
  .catch(error => {
    console.error("Erreur:", error);
  })
  .finally(() => {
    console.log("Opération terminée");
  });

// Promise.all
const promise1 = Promise.resolve(3);
const promise2 = new Promise(resolve => setTimeout(() => resolve("foo"), 100));

Promise.all([promise1, promise2])
  .then(results => {
    console.log(results); // [3, "foo"]
  });

// Async/Await (ES2017)
async function fetchUser() {
  try {
    const response = await fetch('https://api.exemple.com/utilisateurs/1');
    const user = await response.json();
    console.log(user);
    return user;
  } catch (error) {
    console.error("Erreur:", error);
  }
}

// Utilisation avec .then()
fetchUser().then(user => {
  console.log("Utilisateur:", user);
});

Autres fonctionnalités ES6+

Object Shorthand (Raccourci d’objet)

const nom = "Alice";
const age = 30;

// Avant ES6
const personne1 = {
  nom: nom,
  age: age,
  saluer: function() {
    return "Bonjour !";
  }
};

// Avec ES6
const personne2 = {
  nom,
  age,
  saluer() {
    return "Bonjour !";
  }
};

Computed Property Names (Noms de propriétés calculés)

const cle = "statut";
const valeur = "actif";

const objet = {
  [cle]: valeur,
  [`utilisateur_${valeur}`]: true
};

console.log(objet); // { statut: "actif", utilisateur_actif: true }

Array Methods (Méthodes de tableau)

const nombres = [1, 2, 3, 4, 5];

// find
const premier = nombres.find(n => n > 2);
console.log(premier); // 3

// findIndex
const index = nombres.findIndex(n => n > 2);
console.log(index); // 2

// includes (ES2016)
console.log(nombres.includes(3)); // true

// Array.from
const divs = document.querySelectorAll('div');
const divsArray = Array.from(divs);

// Array.of
const arr = Array.of(1, 2, 3);
console.log(arr); // [1, 2, 3]

Object Methods (Méthodes d’objet)

const source = { a: 1, b: 2 };
const cible = { c: 3 };

// Object.assign
const resultat = Object.assign(cible, source);
console.log(resultat); // { a: 1, b: 2, c: 3 }

// Object.entries (ES2017)
console.log(Object.entries(source)); // [["a", 1], ["b", 2]]

// Object.values (ES2017)
console.log(Object.values(source)); // [1, 2]

// Object.fromEntries (ES2019)
const entries = [["a", 1], ["b", 2]];
console.log(Object.fromEntries(entries)); // { a: 1, b: 2 }

Optional Chaining (Chaînage optionnel, ES2020)

const utilisateur = {
  nom: "Alice",
  adresse: {
    ville: "Paris"
  }
};

// Avant ES2020
const ville1 = utilisateur && utilisateur.adresse && utilisateur.adresse.ville;

// Avec ES2020
const ville2 = utilisateur?.adresse?.ville;
console.log(ville2); // "Paris"

// Avec méthodes
const resultat = utilisateur.getInfo?.();

// Avec tableaux
const premier = utilisateur.amis?.[0];

Nullish Coalescing (Opérateur de coalescence des nuls, ES2020)

// Avant ES2020 (problème avec 0 et "")
const valeur1 = donnee || "valeur par défaut";

// Avec ES2020
const valeur2 = donnee ?? "valeur par défaut";

// Différence
console.log(0 || "défaut"); // "défaut"
console.log(0 ?? "défaut"); // 0

console.log("" || "défaut"); // "défaut"
console.log("" ?? "défaut"); // ""

Conclusion

Les fonctionnalités modernes de JavaScript ont considérablement amélioré le langage, le rendant plus expressif, plus sûr et plus agréable à utiliser. Ces améliorations ont contribué à l’essor de JavaScript comme l’un des langages les plus populaires au monde.

Pour rester à jour avec les dernières fonctionnalités, consultez régulièrement les spécifications ECMAScript et utilisez des outils comme Babel pour profiter des nouvelles fonctionnalités même sur les navigateurs plus anciens.

InSkillCoach

À propos de InSkillCoach

Expert en formation et technologies

Coach spécialisé dans les technologies avancées et l'IA, porté par GNeurone Inc.

Certifications:

  • AWS Certified Solutions Architect – Professional
  • Certifications Google Cloud
  • Microsoft Certified: DevOps Engineer Expert
  • Certified Kubernetes Administrator (CKA)
  • CompTIA Security+
808
139

Commentaires

Les commentaires sont alimentés par GitHub Discussions

Connectez-vous avec GitHub pour participer à la discussion

Lien copié !