# 📚 Cours JavaScript pour DevOps - Les Fondamentaux > **⚠ Important** : JavaScript ≠ Java ! Ce sont deux langages complĂštement diffĂ©rents. JavaScript est un langage de scripting moderne utilisĂ© pour le web, le backend (Node.js), et l'automatisation DevOps. --- ## 📖 Table des matiĂšres 1. Les bases de JavaScript 2. Les tableaux et leurs mĂ©thodes 3. Les objets JavaScript 4. Les fonctions 5. Les boucles 6. Les expressions rĂ©guliĂšres (Regex) 7. ExĂ©cuter du code avec Docker --- ## 1ïžâƒŁ Les Bases de JavaScript ### Variables : let, const En JavaScript, on dĂ©clare des variables avec `let` ou `const` : ```javascript let compteur = 0; // Variable modifiable const MAX_LOGS = 100; // Constante (non modifiable) ``` **RĂšgle d'or** : Utilise `const` par dĂ©faut, et `let` seulement si tu dois modifier la valeur. ### Types de donnĂ©es ```javascript // Nombres const cpu = 85; const ram = 90.5; // ChaĂźnes de caractĂšres (strings) const serveur = "srv-01"; const status = 'online'; // BoolĂ©ens const estEnLigne = true; const estHorsDeLigne = false; // Tableaux const serveurs = ["srv-01", "srv-02", "srv-03"]; // Objets const serveur1 = { id: "srv-01", cpu: 45, ram: 60 }; ``` ### OpĂ©rateurs de comparaison ```javascript 45 === 45 // true (Ă©gal strictement) 45 == "45" // true (Ă©gal avec conversion) 45 === "45" // false (types diffĂ©rents) 45 !== 50 // true (diffĂ©rent de) cpu > 80 // true si cpu vaut 85 ram <= 90 // true si ram vaut 90 ou moins ``` **Conseil** : Utilise toujours `===` et `!==` (comparaison stricte). ### OpĂ©rateurs logiques ```javascript // ET logique (&&) : les DEUX conditions doivent ĂȘtre vraies if (cpu > 80 && ram > 80) { console.log("Alerte critique !"); } // OU logique (||) : AU MOINS UNE condition doit ĂȘtre vraie if (cpu > 80 || ram > 80) { console.log("Serveur en alerte"); } // NON logique (!) : inverse le boolĂ©en if (!estEnLigne) { console.log("Serveur hors ligne"); } ``` --- ## 2ïžâƒŁ Les Tableaux (Arrays) Un tableau est une liste ordonnĂ©e d'Ă©lĂ©ments. ### CrĂ©er et accĂ©der aux Ă©lĂ©ments ```javascript const logs = ["Error 404", "Warning", "Info"]; console.log(logs[0]); // "Error 404" (premier Ă©lĂ©ment, index 0) console.log(logs[1]); // "Warning" console.log(logs.length); // 3 (nombre d'Ă©lĂ©ments) ``` **Important** : Les index commencent Ă  0, pas Ă  1 ! ### MĂ©thodes de base (mutation du tableau) Ces mĂ©thodes **modifient** le tableau directement : ```javascript const messages = []; // Ajouter Ă  la fin messages.push("Nouveau log"); // RĂ©sultat : ["Nouveau log"] // Ajouter au dĂ©but messages.unshift("Log prioritaire"); // RĂ©sultat : ["Log prioritaire", "Nouveau log"] // Retirer le dernier Ă©lĂ©ment const dernier = messages.pop(); // RĂ©sultat : messages = ["Log prioritaire"] // Retirer le premier Ă©lĂ©ment const premier = messages.shift(); // RĂ©sultat : messages = [] ``` ### MĂ©thode .filter() - Filtrer des Ă©lĂ©ments **Objectif** : CrĂ©er un nouveau tableau contenant uniquement les Ă©lĂ©ments qui respectent une condition. ```javascript const serveurs = [ { id: "srv-01", cpu: 45, status: "online" }, { id: "srv-02", cpu: 85, status: "online" }, { id: "srv-03", cpu: 12, status: "offline" } ]; // Garder seulement les serveurs online const serveursOnline = serveurs.filter(serveur => serveur.status === "online"); // RĂ©sultat : [srv-01, srv-02] // Garder seulement ceux avec CPU > 80% const alertes = serveurs.filter(serveur => serveur.cpu > 80); // RĂ©sultat : [srv-02] ``` **Syntaxe dĂ©cortiquĂ©e** : ```javascript // serveur => serveur.status === "online" // ↑ paramĂštre ↑ condition qui retourne true ou false ``` ### MĂ©thode .map() - Transformer des Ă©lĂ©ments **Objectif** : CrĂ©er un nouveau tableau en transformant chaque Ă©lĂ©ment. ```javascript const serveurs = [ { id: "srv-01", cpu: 45 }, { id: "srv-02", cpu: 85 } ]; // Extraire juste les IDs const ids = serveurs.map(serveur => serveur.id); // RĂ©sultat : ["srv-01", "srv-02"] // Doubler toutes les valeurs CPU const cpuDoubles = serveurs.map(serveur => serveur.cpu * 2); // RĂ©sultat : [90, 170] ``` ### MĂ©thode .reduce() - RĂ©duire Ă  une seule valeur **Objectif** : Condenser un tableau en une seule valeur (somme, moyenne, etc.). ```javascript const valeurs = [10, 20, 30, 40]; // Calculer la somme const somme = valeurs.reduce((accumulateur, valeur) => { return accumulateur + valeur; }, 0); // 0 = valeur initiale de l'accumulateur // RĂ©sultat : 100 // Étape par Ă©tape : // 1. accumulateur = 0, valeur = 10 → retourne 0 + 10 = 10 // 2. accumulateur = 10, valeur = 20 → retourne 10 + 20 = 30 // 3. accumulateur = 30, valeur = 30 → retourne 30 + 30 = 60 // 4. accumulateur = 60, valeur = 40 → retourne 60 + 40 = 100 ``` **Calcul de moyenne** : ```javascript const cpuValues = [45, 85, 95]; const moyenne = cpuValues.reduce((acc, val) => acc + val, 0) / cpuValues.length; // RĂ©sultat : 75 ``` --- ## 3ïžâƒŁ Les Objets JavaScript Un objet est une collection de propriĂ©tĂ©s (clĂ©-valeur). ```javascript const serveur = { id: "srv-01", cpu: 45, ram: 60, status: "online" }; // AccĂ©der aux propriĂ©tĂ©s console.log(serveur.id); // "srv-01" console.log(serveur["cpu"]); // 45 (notation alternative) // Modifier une propriĂ©tĂ© serveur.cpu = 50; // Ajouter une nouvelle propriĂ©tĂ© serveur.region = "eu-west-1"; ``` --- ## 4ïžâƒŁ Les Fonctions Une fonction est un bloc de code rĂ©utilisable. ### DĂ©claration classique ```javascript function calculerMoyenne(valeurs) { const somme = valeurs.reduce((acc, val) => acc + val, 0); return somme / valeurs.length; } const moyenne = calculerMoyenne([10, 20, 30]); console.log(moyenne); // 20 ``` ### Fonction flĂ©chĂ©e (Arrow function) Syntaxe plus courte, trĂšs utilisĂ©e avec `.map()`, `.filter()`, `.reduce()` : ```javascript // Fonction classique function doubler(x) { return x * 2; } // Fonction flĂ©chĂ©e Ă©quivalente const doubler = (x) => { return x * 2; }; // Version ultra-courte (si une seule instruction) const doubler = x => x * 2; ``` --- ## 5ïžâƒŁ Les Boucles ### Boucle for classique ```javascript for (let i = 0; i < 5; i++) { console.log("ItĂ©ration numĂ©ro " + i); } // Affiche : 0, 1, 2, 3, 4 ``` **DĂ©cortiquĂ©** : - `let i = 0` : Initialisation - `i < 5` : Condition de continuation - `i++` : IncrĂ©mentation (ajoute 1 Ă  i) ### Boucle for...of (parcourir un tableau) ```javascript const serveurs = ["srv-01", "srv-02", "srv-03"]; for (const serveur of serveurs) { console.log(serveur); } // Affiche : srv-01, srv-02, srv-03 ``` --- ## 6ïžâƒŁ Les Expressions RĂ©guliĂšres (Regex) Les regex permettent de chercher et extraire des motifs dans du texte. ### Syntaxe de base ```javascript const regex = /motif/; ``` ### Symboles importants | Symbole | Signification | Exemple | |---------|--------------|---------| | `\d` | Un chiffre (0-9) | `\d+` = un ou plusieurs chiffres | | `\w` | Lettre, chiffre ou _ | `\w+` = un ou plusieurs caractĂšres | | `\s` | Espace blanc | `\s` = un espace | | `+` | 1 ou plusieurs fois | `\d+` = au moins un chiffre | | `*` | 0 ou plusieurs fois | `\d*` = zĂ©ro ou plus chiffres | | `( )` | Groupe de capture | `(\d+)` = capture les chiffres | ### MĂ©thode .test() - VĂ©rifier une prĂ©sence ```javascript const log = "ERROR: Connection failed"; const contientErreur = /ERROR/.test(log); console.log(contientErreur); // true ``` ### MĂ©thode .match() - Extraire des valeurs ```javascript const config = "DB_PORT=5432"; const regex = /DB_PORT=(\d+)/; const match = config.match(regex); if (match) { console.log(match[0]); // "DB_PORT=5432" (toute la correspondance) console.log(match[1]); // "5432" (premier groupe capturĂ©) const port = Number(match[1]); // Convertir en nombre console.log(port); // 5432 } ``` **Exemple pratique** : ```javascript const texte = "L'utilisateur ID:12345 s'est connectĂ©"; const regex = /ID:(\d+)/; const resultat = texte.match(regex); if (resultat) { const userId = resultat[1]; // "12345" console.log("User ID trouvĂ© :", userId); } ``` ### MĂ©thode .split() - DĂ©couper une chaĂźne ```javascript const config = "DB_HOST=localhost;DB_PORT=5432;DB_USER=admin"; // DĂ©couper par ";" const parties = config.split(";"); // RĂ©sultat : ["DB_HOST=localhost", "DB_PORT=5432", "DB_USER=admin"] ``` --- ## 7ïžâƒŁ ExĂ©cuter du Code avec Docker ### Pourquoi Docker ? Docker garantit que ton code s'exĂ©cute dans le **mĂȘme environnement** partout (sur ton PC, celui du prof, en production). ### Structure d'un projet ``` mon-tp/ ├── exercice1.js ├── exercice2.js └── exercice3.js ``` ### Commande d'exĂ©cution Ouvre un terminal dans le dossier de ton projet et tape : ```bash docker container run -it --rm -v $(pwd):/home/node/app -w /home/node/app node:current-alpine3.23 node exercice1.js ``` **DĂ©cortiquĂ©** : - `docker container run` : Lance un conteneur - `-it` : Mode interactif - `--rm` : Supprime le conteneur aprĂšs exĂ©cution - `-v $(pwd):/home/node/app` : Monte le dossier courant dans le conteneur - `-w /home/node/app` : DĂ©finit le dossier de travail - `node:current-alpine3.23` : Image Docker (Node.js) - `node exercice1.js` : Commande Ă  exĂ©cuter **Version simplifiĂ©e pour Windows PowerShell** : ```powershell docker container run -it --rm -v ${PWD}:/home/node/app -w /home/node/app node:current-alpine3.23 node exercice1.js ``` --- ## 🎓 Concepts Essentiels Ă  Retenir ### 1. ChaĂźnage de mĂ©thodes Tu peux combiner plusieurs mĂ©thodes : ```javascript const serveurs = [ { id: "srv-01", cpu: 45, status: "online" }, { id: "srv-02", cpu: 85, status: "online" }, { id: "srv-03", cpu: 12, status: "offline" } ]; const cpuMoyen = serveurs .filter(s => s.status === "online") // Garde les online .map(s => s.cpu) // Extrait les CPU .reduce((acc, cpu) => acc + cpu, 0) // Somme / serveurs.filter(s => s.status === "online").length; // Divise par le nombre console.log(cpuMoyen); // 65 ``` ### 2. Conditions ternaires (raccourci if/else) ```javascript const status = cpu > 80 ? "Alerte" : "OK"; // Équivalent Ă  : let status; if (cpu > 80) { status = "Alerte"; } else { status = "OK"; } ``` ### 3. Template strings (interpolation) ```javascript const serveur = "srv-01"; const cpu = 85; // Ancien style console.log("Serveur " + serveur + " a un CPU de " + cpu + "%"); // Nouveau style (avec backticks ` `) console.log(`Serveur ${serveur} a un CPU de ${cpu}%`); ``` ### 4. DĂ©structuration ```javascript const serveur = { id: "srv-01", cpu: 45, ram: 60 }; // Extraire des propriĂ©tĂ©s const { id, cpu } = serveur; console.log(id); // "srv-01" console.log(cpu); // 45 ``` --- ## 🔧 Exemples Pratiques DevOps ### Exemple 1 : Filtrer les alertes ```javascript const serveurs = [ { id: "srv-01", cpu: 45, ram: 60 }, { id: "srv-02", cpu: 85, ram: 90 }, { id: "srv-03", cpu: 95, ram: 88 } ]; // Trouver tous les serveurs en alerte (CPU > 80 OU RAM > 80) const alertes = serveurs.filter(s => s.cpu > 80 || s.ram > 80); console.log(alertes); // RĂ©sultat : [srv-02, srv-03] ``` ### Exemple 2 : Calculer la moyenne CPU ```javascript const serveurs = [ { id: "srv-01", cpu: 45 }, { id: "srv-02", cpu: 85 }, { id: "srv-03", cpu: 95 } ]; const totalCpu = serveurs.reduce((acc, s) => acc + s.cpu, 0); const moyenne = totalCpu / serveurs.length; console.log(`CPU moyen : ${moyenne}%`); // RĂ©sultat : CPU moyen : 75% ``` ### Exemple 3 : Parser une configuration ```javascript const config = "DB_HOST=localhost;DB_PORT=5432;DB_USER=admin"; const pairs = config.split(";"); // ["DB_HOST=localhost", ...] const configObj = {}; for (const pair of pairs) { const [key, value] = pair.split("="); // SĂ©pare par "=" // Si c'est un nombre, le convertir configObj[key] = isNaN(value) ? value : Number(value); } console.log(configObj); // { DB_HOST: "localhost", DB_PORT: 5432, DB_USER: "admin" } ``` ---