Dashboard HTML CSS JavaScript Lua 5.4 Lua 5.5 Éditeur Documentation
Référence complète

Documentation HTML, CSS, JavaScript & Lua

Guide de référence complet pour les balises HTML, propriétés CSS, fonctions JavaScript et le langage Lua.

Structure HTML

Toute page HTML commence par la déclaration DOCTYPE et suit une structure de base avec les éléments <html>, <head> et <body>.

ÉlémentDescriptionExemple
<!DOCTYPE html>Déclare le document comme HTML5Première ligne de tout fichier HTML
<html>Élément racine contenant tout le document<html lang="fr">...</html>
<head>En-tête avec métadonnées, titre, liens CSS<head><title>Page</title></head>
<body>Corps du document, contenu visible<body><h1>Bonjour</h1></body>
<meta>Balise auto-fermante pour métadonnées<meta charset="UTF-8">
<title>Titre affiché dans l'onglet du navigateur<title>Mon Site</title>
<link>Lien vers une ressource externe (CSS, favicon)<link rel="stylesheet" href="style.css">
<style>Bloc de styles CSS intégrés<style>body { margin: 0; }</style>
<script>Inclut ou exécute du JavaScript<script src="app.js"></script>
<noscript>Contenu affiché si JS est désactivé<noscript>Activez JS</noscript>

Exemple complet

HTML
<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Mon Site</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <h1>Bienvenue !</h1>
    <script src="app.js"></script>
</body>
</html>

Titres (h1 - h6)

Les titres structurent le contenu en hiérarchie. <h1> est le titre principal (un seul par page), jusqu'à <h6>.

BaliseNiveauExemple
<h1>Titre principal<h1>Titre principal</h1>
<h2>Sous-titre de section<h2>Section</h2>
<h3>Sous-section<h3>Sous-section</h3>
<h4>Titre de groupe<h4>Groupe</h4>
<h5>Titre de sous-groupe<h5>Sous-groupe</h5>
<h6>Niveau le plus bas<h6>Détail</h6>
Astuce SEO

Utilisez un seul <h1> par page et respectez la hiérarchie (pas de saut de h2 à h4). Cela améliore l'accessibilité et le référencement.

Texte & Paragraphes

BaliseDescriptionExemple
<p>Paragraphe<p>Texte ici.</p>
<br>Saut de ligne (auto-fermante)Ligne 1<br>Ligne 2
<hr>Ligne horizontale de séparation<hr>
<pre>Texte préservant l'espacement<pre> espace </pre>

Images (img)

L'élément <img> est auto-fermé et affiche une image. L'attribut alt est obligatoire pour l'accessibilité.

AttributDescriptionValeurs
srcChemin vers l'imageURL ou chemin relatif
altTexte alternatif (obligatoire)Description de l'image
widthLargeur en pixelsNombre entier
heightHauteur en pixelsNombre entier
loadingChargement différélazy, eager
srcsetImages responsivesListe de sources avec densité
HTML
<img src="photo.jpg" alt="Description" width="300" height="200" loading="lazy">

<!-- Image responsive -->
<img
    src="photo-800.jpg"
    srcset="photo-400.jpg 400w, photo-800.jpg 800w, photo-1200.jpg 1200w"
    sizes="(max-width: 600px) 400px, 800px"
    alt="Paysage"
>
Important

Toujours inclure l'attribut alt pour les lecteurs d'écran. Utilisez loading="lazy" pour les images hors écran afin d'améliorer les performances.

Listes

BaliseDescriptionExemple
<ul>Liste à puces (unordered)<ul><li>Item</li></ul>
<ol>Liste numérotée (ordered)<ol><li>Item</li></ol>
<li>Élément de liste<li>Texte</li>
<dl>Liste de définitions<dl><dt><dd></dl>
<dt>Terme à définir<dt>HTML</dt>
<dd>Définition du terme<dd>Langage de balisage</dd>
HTML
<ul>
    <li>Pomme</li>
    <li>Orange</li>
</ul>

<ol start="5" type="A">
    <li>Premier</li>
    <li>Deuxième</li>
</ol>

<dl>
    <dt>HTML</dt>
    <dd>HyperText Markup Language</dd>
</dl>

Tableaux

Les tableaux affichent des données sous forme de lignes et colonnes.

BaliseDescription
<table>Conteneur principal du tableau
<thead>En-tête du tableau
<tbody>Corps du tableau
<tfoot>Pied de tableau
<tr>Ligne du tableau
<th>Cellule d'en-tête (gras)
<td>Cellule de données
AttributDescriptionExemple
colspanFusionner des colonnes<td colspan="2">
rowspanFusionner des lignes<td rowspan="3">
scopePortée de l'en-têtecol, row
HTML
<table>
    <thead>
        <tr>
            <th scope="col">Nom</th>
            <th scope="col">Âge</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>Alice</td>
            <td>25</td>
        </tr>
        <tr>
            <td colspan="2">Total : 1 personne</td>
        </tr>
    </tbody>
</table>

Formulaires

Les formulaires permettent la collecte de données utilisateur.

Éléments de formulaire

BaliseDescription
<form>Conteneur du formulaire
<input>Champ de saisie (auto-fermant)
<label>Étiquette liée à un champ
<select>Liste déroulante
<option>Option dans une liste
<optgroup>Groupe d'options
<textarea>Zone de texte multi-lignes
<button>Bouton d'action
<fieldset>Groupe logique de champs
<legend>Titre d'un fieldset
<datalist>Suggestions prédéfinies pour un input
<output>Résultat d'un calcul

Types d'input

TypeDescriptionExemple
textTexte simple<input type="text">
passwordMot de passe masqué<input type="password">
emailSaisie d'email (validation auto)<input type="email">
numberNombre avec contrôles<input type="number" min="0" max="100">
telNuméro de téléphone<input type="tel">
urlSaisie d'URL<input type="url">
searchChamp de recherche<input type="search">
dateSélecteur de date<input type="date">
timeSélecteur d'heure<input type="time">
datetime-localDate et heure locales<input type="datetime-local">
monthSélecteur mois/année<input type="month">
weekSélecteur semaine<input type="week">
rangeCurseur (slider)<input type="range" min="0" max="100">
colorSélecteur de couleur<input type="color">
fileSélection de fichier<input type="file" accept="image/*">
hiddenChamp invisible<input type="hidden" value="abc">
checkboxCase à cocher<input type="checkbox">
radioBouton radio (sélection unique)<input type="radio" name="choix">

Attributs des inputs

AttributDescription
nameNom du champ (clé dans les données envoyées)
valueValeur par défaut du champ
placeholderTexte d'aide grisé
requiredChamp obligatoire
disabledChamp désactivé
readonlyChamp en lecture seule
min / maxValeurs min/max (nombre, date)
minlength / maxlengthLongueur min/max du texte
patternExpression régulière de validation
autofocusFocus automatique au chargement
autocompleteAutoriser l'autocomplétion
multipleAutoriser plusieurs valeurs
HTML
<form action="/submit" method="POST">
    <fieldset>
        <legend>Informations</legend>
        <label for="nom">Nom :</label>
        <input type="text" id="nom" name="nom" required>

        <label for="email">Email :</label>
        <input type="email" id="email" name="email" placeholder="nom@example.com">

        <label for="mdp">Mot de passe :</label>
        <input type="password" id="mdp" name="mdp" minlength="8">

        <label for="pays">Pays :</label>
        <select id="pays" name="pays">
            <option value="">-- Choisir --</option>
            <option value="FR">France</option>
            <option value="BE">Belgique</option>
        </select>

        <textarea name="message" rows="4" cols="50"></textarea>
        <button type="submit">Envoyer</button>
    </fieldset>
</form>

Éléments sémantiques

Les éléments sémantiques donnent un sens au contenu, améliorant l'accessibilité et le SEO.

BaliseDescription
<header>En-tête d'une section ou de la page
<nav>Bloc de navigation
<main>Contenu principal (unique par page)
<section>Section thématique du contenu
<article>Contenu autonome (article, post)
<aside>Contenu secondaire (sidebar)
<footer>Pied d'une section ou de la page
<figure>Contenu illustré (image, graphique)
<figcaption>Légende d'une figure
<details>Contenu pliable/dépliable
<summary>Résumé d'un élément details
<mark>Texte surligné/mis en avant
<time>Date ou heure (machine-readable)
<progress>Barre de progression
<meter>Jauge / mesure scalaire
HTML
<header>
    <nav><a href="/">Accueil</a></nav>
</header>
<main>
    <article>
        <h2>Mon Article</h2>
        <time datetime="2026-01-15">15 janvier 2026</time>
        <p>Contenu...</p>
        <figure>
            <img src="photo.jpg" alt="Description">
            <figcaption>Légende</figcaption>
        </figure>
    </article>
    <aside><h3>Articles connexes</h3></aside>
</main>
<footer><p>&copy; 2026</p></footer>

Formatage de texte

BaliseDescriptionRendu
<strong>Texte important (gras sémantique)Gras
<b>Gras sans importance sémantiqueGras
<em>Accentuation (italique sémantique)Italique
<i>Italique sans importance sémantiqueItalique
<mark>Texte surlignéSurligné
<small>Texte de petite taillePetit
<del>Texte supprimé (barré)Supprimé
<ins>Texte inséré (souligné)Inséré
<s>Texte obsolète (barré)Obsolète
<sub>Indice (subscript)H2O
<sup>Exposant (superscript)x2
<code>Code en lignecode
<kbd>Entrée clavierCtrl+C
<samp>Sortie d'un programmeError
<var>Variable mathématiquex + y
<abbr>AbréviationHTML
<blockquote>Citation longueCitation en bloc
<q>Citation courteCitation inline
<cite>Titre d'une œuvreTitre cité

Médias

BaliseDescriptionAttributs clés
<video>Lecteur vidéo intégrésrc, controls, autoplay, muted, loop, poster
<audio>Lecteur audio intégrésrc, controls, autoplay, muted, loop
<source>Source alternative (dans video/audio)src, type
<iframe>Page web intégréesrc, width, height, allowfullscreen, loading
<svg>Graphiques vectoriels SVGviewBox, width, height
<canvas>Surface de dessin (via JS)width, height
<picture>Conteneur pour sources d'imageContient <source> et <img>
HTML
<!-- Vidéo -->
<video controls width="640" poster="thumb.jpg">
    <source src="video.mp4" type="video/mp4">
    <source src="video.webm" type="video/webm">
    Votre navigateur ne supporte pas la vidéo.
</video>

<!-- Audio -->
<audio controls loop>
    <source src="musique.mp3" type="audio/mpeg">
</audio>

<!-- Iframe (YouTube) -->
<iframe width="560" height="315" src="https://youtube.com/embed/ID"
    allowfullscreen loading="lazy"></iframe>

<!-- Canvas -->
<canvas id="monCanvas" width="400" height="300"></canvas>

<!-- SVG -->
<svg viewBox="0 0 100 100" width="100">
    <circle cx="50" cy="50" r="40" fill="purple"/>
</svg>

Attributs universels

AttributDescriptionExemple
idIdentifiant unique de l'élément<div id="header">
classClasse(s) CSS (une ou plusieurs)<div class="container active">
styleStyles CSS en ligne<p style="color: red;">
titleInfobulle au survol<span title="Info">
data-*Données personnalisées<div data-user-id="42">
hiddenMasque l'élément<div hidden>
tabindexOrdre de navigation clavier<button tabindex="0">
contenteditableRend l'élément éditable<div contenteditable>
draggableRend l'élément glissable<img draggable="true">
langLangue de l'élément<span lang="en">
Les data attributes

Les attributs data-* stockent des données personnalisées accessibles via JS : element.dataset.userId pour data-user-id="42".

Sélecteurs CSS

Les sélecteurs ciblent les éléments HTML pour leur appliquer des styles.

SélecteurDescriptionExemple
*Sélecteur universel* { margin: 0; }
typePar nom de balisep { color: red; }
.classPar classe.container { max-width: 1200px; }
#idPar ID unique#header { position: fixed; }
A BDescendantdiv p { }
A > BEnfant directnav > a { }
A + BFrère adjacenth2 + p { }
A ~ BFrères suivantsh2 ~ p { }
[attr]Avec l'attribut[target] { }
[attr="val"]Attribut = valeur[type="text"] { }
:hoverSurvol sourisa:hover { color: red; }
:activeClic en coursbutton:active { }
:focusFocus clavierinput:focus { }
:first-childPremier enfantli:first-child { }
:last-childDernier enfantli:last-child { }
:nth-child(n)Enfant position nli:nth-child(2n) { }
:nth-of-type(n)ne de son typep:nth-of-type(odd) { }
:not(sel)Sauf ce sélecteur:not(.hidden) { }
::beforePseudo-élément avanth2::before { content: "→"; }
::afterPseudo-élément aprèsa::after { content: " ↗"; }
::first-linePremière lignep::first-line { font-weight: bold; }
::first-letterPremière lettrep::first-letter { font-size: 2em; }
::selectionTexte sélectionné::selection { background: purple; }
Spécificité

Priorité : !important > inline > #id > .class > type > *. Utilisez le moins de spécificité possible.

Modèle de boîte (Box Model)

PropriétéDescriptionExemple
width / heightTaille du contenuwidth: 200px;
min-width / max-widthTaille min/maxmax-width: 1200px;
min-height / max-heightHauteur min/maxmin-height: 100vh;
paddingEspace intérieurpadding: 16px 24px;
borderBordureborder: 1px solid #ccc;
border-radiusArrondi des coinsborder-radius: 8px;
marginEspace extérieurmargin: 0 auto;
box-sizingInclure padding/border dans la taillebox-sizing: border-box;
overflowDébordementoverflow: hidden;
overflow-x / overflow-yDébordement par axeoverflow-x: auto;
CSS
* { box-sizing: border-box; }

.card {
    width: 300px;
    padding: 20px;
    margin: 16px 0;
    border: 1px solid #ddd;
    border-radius: 8px;
}

Flexbox

Modèle de disposition unidimensionnel pour aligner et distribuer l'espace entre les éléments.

PropriétéDescriptionValeurs courantes
displayActive Flexboxflex, inline-flex
flex-directionDirection des élémentsrow, column, row-reverse, column-reverse
justify-contentAlignement horizontalflex-start, center, space-between, space-around, space-evenly
align-itemsAlignement verticalflex-start, center, flex-end, stretch, baseline
align-selfAlignement d'un enfantMêmes valeurs que align-items
flex-wrapRenvoi à la lignenowrap, wrap, wrap-reverse
gapEspace entre élémentsgap: 16px;
flex-growAgrandissement1 (grandit), 0 (non)
flex-shrinkRéduction1 (rétrécit), 0 (non)
flex-basisTaille de baseauto, 0, 200px
flexRaccourci grow shrink basisflex: 1, flex: 0 1 auto
orderOrdre d'affichageNombre entier (défaut: 0)
CSS
.container {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 16px;
    flex-wrap: wrap;
}
.sidebar { flex: 0 0 250px; }
.main    { flex: 1; }

Grid

Modèle bidimensionnel pour créer des mises en page en lignes et colonnes.

PropriétéDescriptionExemple
displayActive Griddisplay: grid;
grid-template-columnsDéfinit les colonnes200px 1fr 1fr
grid-template-rowsDéfinit les lignesauto 1fr auto
gapEspace entre cellulesgap: 20px;
grid-columnPosition de colonnegrid-column: 1 / 3;
grid-rowPosition de lignegrid-row: 1 / 2;
grid-areaNommage de zonegrid-area: header;
grid-template-areasLayout visuel nommé"header header" "sidebar main";
grid-auto-rowsTaille des lignes autominmax(100px, auto)
justify-itemsAlignement cellule Hstart, center, end, stretch
align-itemsAlignement cellule Vstart, center, end, stretch
justify-contentAlignement grille Hstart, center, space-between
align-contentAlignement grille Vstart, center, space-between
CSS
.layout {
    display: grid;
    grid-template-columns: 250px 1fr;
    gap: 32px;
}

.page {
    display: grid;
    grid-template-areas:
        "header  header"
        "sidebar main"
        "footer  footer";
    grid-template-columns: 250px 1fr;
}
.header  { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main    { grid-area: main; }

.grid {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
    gap: 20px;
}
Unité fr

1fr 2fr donne 1/3 à la première colonne, 2/3 à la seconde.

Position

ValeurDescriptionDécalage
staticDéfaut (flux normal)Ignoré
relativeRelatif à sa positionDécalage visible, espace préservé
absoluteParent positioned le plus procheHors du flux normal
fixedFixé par rapport à la fenêtreReste en place au scroll
stickyAlternance relative/fixedSe fixe au scroll
CSS
.navbar {
    position: fixed;
    top: 0; left: 0; right: 0;
    z-index: 1000;
}
.sidebar {
    position: sticky;
    top: 72px;
    height: calc(100vh - 72px);
}
.overlay {
    position: fixed;
    top: 0; left: 0;
    width: 100%; height: 100%;
    background: rgba(0,0,0,0.5);
    z-index: 2000;
}

Responsive Design

BREAKPOINTAppareil@media
< 480pxMobile petit@media (max-width: 479px)
< 768pxMobile / Tablette@media (max-width: 767px)
< 1024pxTablette@media (max-width: 1023px)
< 1200pxDesktop@media (max-width: 1199px)
> 1200pxGrand écran@media (min-width: 1200px)
CSS
.grid {
    display: grid;
    grid-template-columns: 1fr;
}
@media (min-width: 768px) {
    .grid { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 1024px) {
    .grid { grid-template-columns: 1fr 1fr 1fr; }
}

Animations et transitions

PropriétéDescriptionExemple
transitionTransition doucetransition: all 0.3s ease;
transition-propertyPropriétés à animerbackground, transform;
transition-durationDurée0.3s, 300ms
transition-timing-functionCourbeease, linear, ease-in-out
transition-delayDélai0.1s
animationApplique @keyframesanimation: fadeIn 0.5s ease forwards;
@keyframesDéfinit les étapes@keyframes fade { from { opacity:0; } }
transformForme/positionrotate(45deg) scale(1.2);

Transformations courantes

FonctionDescriptionExemple
translate(x, y)Déplacementtransform: translate(20px, -10px);
scale(x, y)Agrandissementtransform: scale(1.5);
rotate(angle)Rotationtransform: rotate(45deg);
skew(x, y)Inclinaisontransform: skew(5deg, 2deg);
matrix()Combinéetransform: matrix(1,0,0,1,0,0);
CSS
.btn {
    transition: all 0.25s ease;
}
.btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 4px 16px rgba(139,92,246,0.3);
}

@keyframes fadeIn {
    from { opacity: 0; transform: translateY(20px); }
    to   { opacity: 1; transform: translateY(0); }
}
.card { animation: fadeIn 0.5s ease forwards; }

@keyframes spin {
    to { transform: rotate(360deg); }
}
.loader { animation: spin 1s linear infinite; }

Variables CSS (Custom Properties)

CSS
:root {
    --primary: #8b5cf6;
    --text: #f0f0ff;
    --bg: #0f0f1a;
    --radius: 8px;
    --spacing: 16px;
}
.card {
    background: var(--bg);
    color: var(--text);
    border-radius: var(--radius);
    padding: var(--spacing);
}
.box {
    color: var(--custom, #333);
}

Typographie

PropriétéDescriptionExemple
font-familyFamille de policesfont-family: 'Inter', sans-serif;
font-sizeTaille1rem, clamp(1rem, 3vw, 2rem)
font-weightÉpaisseur400, 700, 800
font-styleStylenormal, italic
line-heightInterligne1.6, 150%
letter-spacingEspace lettres0.5px, -0.02em
text-alignAlignementleft, center, right, justify
text-decorationDécorationnone, underline, line-through
text-transformCasseuppercase, lowercase, capitalize
text-overflowDépassementellipsis, clip
white-spaceEspacesnowrap, pre, pre-wrap
word-breakCasse motsbreak-all, break-word
text-shadowOmbre texte2px 2px 4px rgba(0,0,0,0.3);
directionSensltr, rtl

Couleurs et arrière-plans

PropriétéDescriptionExemple
colorCouleur textecolor: #fff;
background-colorCouleur fondbackground-color: rgba(0,0,0,0.5);
backgroundRaccourcibackground: url('img.jpg') center/cover;
background-imageImage de fondbackground-image: url('bg.png');
background-sizeTaille imagecover, contain
background-positionPositioncenter, top left
background-repeatRépétitionno-repeat, repeat-x
background-attachmentScrollfixed, scroll
opacityTransparence0.5
box-shadowOmbre0 4px 24px rgba(0,0,0,0.3);
backdrop-filterFiltre arrièrebackdrop-filter: blur(20px);
filterFiltre visuelfilter: grayscale(100%);
CSS
.gradient {
    background: linear-gradient(135deg, #8b5cf6, #a855f7);
}
.gradient-text {
    background: linear-gradient(135deg, #8b5cf6, #a855f7);
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    background-clip: text;
}
.glass {
    background: rgba(255,255,255,0.05);
    backdrop-filter: blur(20px);
    border: 1px solid rgba(255,255,255,0.1);
}

Référence rapide CSS

PropriétéDescriptionValeurs courantes
displayAffichageblock, inline, flex, grid, none
visibilityVisibilitévisible, hidden
cursorCurseurpointer, default, not-allowed
z-indexEmpilementEntier (positioned uniquement)
object-fitAjustement imagecover, contain, fill
pointer-eventsInteractions sourisauto, none
clip-pathDécoupecircle(50%), polygon()
aspect-ratioRatio16/9, 1
user-selectSélectionnone, all
list-styleListesnone, disc, decimal
outlineContour2px solid purple;
appearanceApparence nativenone
CSS Fonctions utiles

calc() : calculs (calc(100% - 40px)). min() / max() : valeur bornée. clamp() : valeur entre min et max. var() : variable custom. url() : ressource externe.

Variables

Mot-cléPortéeRéassignableHérité
letBloc { }OuiNon
constBloc { }NonNon
varFonctionOuiNon
JavaScript
let nom = "Alice";        // Réassignable
const age = 25;            // Non réassignable
var ancien = true;         // À éviter

// Destructuring
const [a, b] = [1, 2];
const { nom: n, age: a } = { nom: "Bob", age: 30 };

// Template literals
const msg = `Bonjour ${nom}, ${age} ans`;

// Spread operator
const arr2 = [...arr, 3, 4];
const obj2 = { ...obj, nouveau: true };
const vs let

Utilisez const par défaut. let uniquement pour la réassignation. Évitez var.

Types de données

TypeDescriptionExemple
stringChaîne de caractères"Bonjour", 'Hello', `Template`
numberNombre42, 3.14, NaN, Infinity
booleanVrai / Fauxtrue, false
nullValeur absentelet x = null;
undefinedSans valeurlet x; // undefined
objectCollection clé-valeur{ nom: "Alice" }
arrayTableau ordonné[1, 2, 3]
functionFonction() => {}
symbolIdentifiant uniqueSymbol("id")
bigintGrand entier9007199254740991n
JavaScript
typeof "hello"    // "string"
typeof 42         // "number"
typeof true      // "boolean"
typeof null      // "object"  (bug historique)
typeof undefined // "undefined"
typeof []        // "object"
typeof {}        // "object"

Array.isArray([])      // true
"hello".length         // 5
42.toString()         // "42"
parseInt("42")       // 42
parseFloat("3.14")   // 3.14
String(42)           // "42"
Number("42")         // 42
Boolean(1)           // true

Opérateurs

CatégorieOpérateursDescription
Aritmétique+ - * / % **Addition, soustraction, multiplication, division, modulo, puissance
Affectation= += -= *= /= %=Affectation combinée
Comparaison== === != !==Égalité (faible/stricte), différence
Logique&& || !ET, OU, NON
Ternaire? :Condition inline
Nul coalescent??Valeur alternative si null/undefined
Optional chaining?.Accès sécurisé
Typetypeof instanceofVérification type
JavaScript
5 == "5"    // true  (conversion)
5 === "5"   // false (types différents)

const v = null ?? "défaut";  // "défaut"
const v2 = 0 ?? "défaut";    // 0

const ville = user?.address?.city;  // undefined si nul

const role = age >= 18 ? "majeur" : "mineur";

Conditions

StructureDescription
if / else if / elseCondition principale
switchMultiple valeurs
?: (ternaire)Condition inline
JavaScript
if (age >= 18) {
    console.log("Majeur");
} else if (age >= 16) {
    console.log("Presque majeur");
} else {
    console.log("Mineur");
}

switch (jour) {
    case "lundi":
    case "mardi":
        console.log("Début semaine");
        break;
    case "vendredi":
        console.log("Week-end !");
        break;
    default:
        console.log("Autre jour");
}

const r = score >= 10 ? "Réussite" : "Échec";

Boucles

BoucleUsageSyntaxe
forClassique avec compteurfor (let i = 0; i < 10; i++) {}
whileTant que condition vraiewhile (condition) {}
do...whileAu moins une foisdo {} while (condition);
for...ofValeurs d'un itérablefor (const item of array) {}
for...inClés d'un objetfor (const key in obj) {}
breakSort de la bouclebreak;
continueItération suivantecontinue;
JavaScript
for (let i = 0; i < 5; i++) {
    console.log(i);
}

const fruits = ["pomme", "banane", "cerise"];
for (const fruit of fruits) {
    console.log(fruit);
}

const user = { nom: "Alice", age: 25 };
for (const cle in user) {
    console.log(cle, user[cle]);
}

Fonctions

SyntaxeDescription
function nom() {}Déclaration de fonction
const nom = function() {}Expression de fonction
const nom = () => {}Fonction fléchée (arrow function)
param = valeurParamètres par défaut
...argsParamètres rest (tableau)
() => expressionRetour implicite
JavaScript
function saluer(nom) {
    return `Bonjour ${nom} !`;
}

const add = (a, b) => a + b;

const accueillir = (nom = "Visiteur") => `Bonjour ${nom}`;

const somme = (...nombres) => {
    return nombres.reduce((a, b) => a + b, 0);
};
somme(1, 2, 3); // 6

const executer = (fn) => fn();
executer(() => "Hello !");

Tableaux - Méthodes

Les méthodes de tableaux sont essentielles pour manipuler des collections de données.

MéthodeDescriptionRetourne
.push()Ajoute un élément en finNouvelle longueur
.pop()Retire le dernier élémentÉlément retiré
.shift()Retire le premier élémentÉlément retiré
.unshift()Ajoute un élément en débutNouvelle longueur
.splice()Ajoute/supprime à une positionÉléments supprimés
.slice()Extrait une portionNouveau tableau
.concat()Fusionne des tableauxNouveau tableau
.includes()Présence d'un élémenttrue / false
.indexOf()Index du premier trouvéNombre ou -1
.find()Premier élément satisfaisant le testÉlément ou undefined
.findIndex()Index du premier trouvéNombre ou -1
.filter()Filtre les élémentsNouveau tableau
.map()Transforme chaque élémentNouveau tableau
.forEach()Exécute pour chaqueundefined
.reduce()Réduit à une seule valeurValeur accumulée
.sort()Trie les élémentsTableau trié (muté)
.reverse()Inverse l'ordreTableau inversé (muté)
.flat()Aplatit un tableauNouveau tableau
.some()Au moins un passe le testtrue / false
.every()Tous passent le testtrue / false
.join()Joint en chaîneString
.keys()IndexIterator
.values()ValeursIterator
.entries()Paires [index, valeur]Iterator
Array.from()Crée depuis un itérableNouveau tableau
Array.isArray()Vérifie si tableautrue / false
JavaScript
const nums = [1, 2, 3, 4, 5];

// Filter : garde les pairs
const pairs = nums.filter(n => n % 2 === 0); // [2, 4]

// Map : double chaque valeur
const doubled = nums.map(n => n * 2); // [2, 4, 6, 8, 10]

// Reduce : somme
const sum = nums.reduce((acc, n) => acc + n, 0); // 15

// Find
const found = nums.find(n => n > 3); // 4

// Chaining
const result = nums
    .filter(n => n > 2)
    .map(n => n * 10)
    .reduce((a, b) => a + b, 0); // 120

// Sort
const letters = ["c", "a", "b"];
letters.sort(); // ["a", "b", "c"]

nums.sort((a, b) => b - a); // Décroissant

// Push / Pop
nums.push(6);   // Ajoute 6 en fin
nums.pop();     // Retire le dernier

// Slice
const sub = nums.slice(1, 3); // Éléments index 1 et 2

// Splice
nums.splice(1, 2); // Supprime 2 éléments à partir de l'index 1
nums.splice(1, 0, 99); // Insère 99 à l'index 1

// Join
"hello".split("").join("-"); // "h-e-l-l-o"

Objets

JavaScript
const user = {
    nom: "Alice",
    age: 25,
    saluer() {
        return `Je suis ${this.nom}`;
    }
};

// Accès
user.nom;          // "Alice"
user["age"];      // 25
user.saluer();   // "Je suis Alice"

// Ajouter / Modifier
user.email = "alice@mail.com";
user.age = 26;

// Supprimer
delete user.age;

// Vérifier
"nom" in user;         // true
user.hasOwnProperty("nom"); // true

// Clés / Valeurs
Object.keys(user);    // ["nom", "email"]
Object.values(user);  // ["Alice", "alice@mail.com"]
Object.entries(user); // [["nom","Alice"], ["email","alice@mail.com"]]

// Destructuring
const { nom, email } = user;

// Spread
const copie = { ...user, age: 30 };
MéthodeDescription
Object.keys(obj)Retourne un tableau des clés
Object.values(obj)Retourne un tableau des valeurs
Object.entries(obj)Retourne un tableau de paires [clé, valeur]
Object.assign(target, ...sources)Copie les propriétés
Object.freeze(obj)Empêche la modification
Object.keys(obj).lengthNombre de propriétés

DOM (Document Object Model)

Le DOM permet de manipuler le contenu HTML via JavaScript.

MéthodeDescriptionRetourne
getElementById("id")Cible par IDÉlément ou null
querySelector(".sel")Premier élément correspondantÉlément ou null
querySelectorAll(".sel")Tous les éléments correspondantsNodeList
getElementsByClassName("cls")Par classeHTMLCollection
getElementsByTagName("tag")Par baliseHTMLCollection
createElement("tag")Crée un élémentNouvel élément
createTextNode("text")Crée un nœud texteNœud texte
appendChild(el)Ajoute un enfantL'élément ajouté
prepend(el)Ajoute au débutL'élément ajouté
append(el)Ajoute à la finL'élément ajouté
insertBefore(new, ref)Insère avant un référentL'élément ajouté
removeChild(el)Supprime un enfantÉlément supprimé
replaceChild(new, old)Remplace un enfantAncien élément
cloneNode(deep)Clone un élémentCopie de l'élément
closest(".sel")Plus proche ancêtre correspondantÉlément ou null
matches(".sel")Vérifie si l'élément correspondtrue / false
PropriétéDescription
textContentTexte brut de l'élément
innerHTMLContenu HTML interne
innerTextTexte visible (avec style)
outerHTMLHTML complet de l'élément
classNameChaîne de classes
classListAPI de classes (add, remove, toggle, contains)
idID de l'élément
styleObjet de styles en ligne
datasetObjet des attributs data-*
parentNodeÉlément parent
childrenÉléments enfants
firstElementChildPremier enfant
lastElementChildDernier enfant
nextElementSiblingFrère suivant
previousElementSiblingFrère précédent
offsetWidth / offsetHeightTaille avec padding/border
clientWidth / clientHeightTaille avec padding (sans bordure/scroll)
JavaScript
// Sélectionner
const btn = document.querySelector("#myBtn");
const items = document.querySelectorAll(".item");

// Créer et ajouter
const div = document.createElement("div");
div.textContent = "Bonjour !";
div.classList.add("card");
document.body.appendChild(div);

// Classes
div.classList.add("active");
div.classList.remove("hidden");
div.classList.toggle("visible");
div.classList.contains("active"); // true

// Styles
div.style.color = "red";
div.style.backgroundColor = "#333";

// Data attributes
div.dataset.userId = "42";
console.log(div.dataset.userId); // "42"

// Parcourir
items.forEach(item => {
    console.log(item.textContent);
});

Événements

ÉvénementDescription
clickClic souris
dblclickDouble clic
mousedown / mouseupBouton enfoncé / relâché
mouseenter / mouseleaveSouris entre / quitte l'élément
mousemoveMouvement souris
mouseover /mouseoutSouris au-dessus / dehors
keydown / keyupTouche enfoncée / relâchée
keypressTouche pressée (obsolète)
submitEnvoi de formulaire
changeValeur modifiée et validée
inputModification de valeur (temps réel)
focus / blurFocus / perte de focus
scrollDéfilement
resizeRedimensionnement fenêtre
loadRessource chargée
DOMContentLoadedDOM prêt (sans images)
touchstart / touchendDébut / fin touche tactile
touchmoveMouvement tactile
drag / dragstart / dragendGlisser-déposer
copy / pasteCopier / Coller
JavaScript
const btn = document.querySelector("button");

// addEventListener
btn.addEventListener("click", (e) => {
    console.log(e.target);
    console.log(e.type);
    e.preventDefault(); // Empêche le comportement par défaut
});

// Clavier
document.addEventListener("keydown", (e) => {
    console.log(e.key);     // "Enter", "Escape", "a"...
    console.log(e.code);     // "Enter", "KeyA"...
    console.log(e.altKey);   // true si Alt enfoncé
    console.log(e.ctrlKey);  // true si Ctrl enfoncé
    console.log(e.shiftKey); // true si Shift enfoncé
});

// Supprimer un écouteur
function handler(e) { console.log("click"); }
btn.addEventListener("click", handler);
btn.removeEventListener("click", handler);

// Événement au document
document.addEventListener("DOMContentLoaded", () => {
    console.log("DOM prêt !");
});

JSON

JSON (JavaScript Object Notation) est un format d'échange de données universel.

MéthodeDescriptionExemple
JSON.stringify(obj)Objet vers chaîne JSON'{"nom":"Alice"}'
JSON.parse(str)Chaîne JSON vers objet{ nom: "Alice" }
JavaScript
// Sérialiser
const user = { nom: "Alice", age: 25 };
const json = JSON.stringify(user);
console.log(json); // '{"nom":"Alice","age":25}'

// Avec indentation
const pretty = JSON.stringify(user, null, 2);

// Désérialiser
const obj = JSON.parse(json);
console.log(obj.nom); // "Alice"

// Sauvegarder / Charger du localStorage
localStorage.setItem("user", JSON.stringify(user));
const saved = JSON.parse(localStorage.getItem("user"));

Async / Await & Fetch

JavaScript est asynchrone par nature. Ces outils gèrent les opérations qui prennent du temps (réseau, timers).

ConceptDescription
PromiseObjet représentant un résultat futur
asyncDéclare une fonction asynchrone
awaitAttend la résolution d'une Promise
fetch()Requête HTTP
setTimeout()Exécute après un délai
setInterval()Exécute à intervalle régulier
clearTimeout()Annule un setTimeout
clearInterval()Annule un setInterval
Promise.all()Attend toutes les promises
Promise.race()La première qui résout
Promise.allSettled()Attend que toutes soient terminées
JavaScript
// Promise
const maPromise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("Succès !");
        // reject(new Error("Erreur !"));
    }, 2000);
});

maPromise
    .then(result => console.log(result))
    .catch(err => console.error(err));

// Async / Await
async function chargerData() {
    try {
        const response = await fetch("https://api.example.com/data");
        const data = await response.json();
        console.log(data);
    } catch (err) {
        console.error("Erreur :", err);
    }
}

// Fetch POST
const response = await fetch("/api/users", {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ nom: "Alice" })
});

// Promises en parallèle
const [users, posts] = await Promise.all([
    fetch("/api/users").then(r => r.json()),
    fetch("/api/posts").then(r => r.json())
]);
async/await

await ne fonctionne que dans une fonction async. Il simplifie la lecture du code asynchrone par rapport à .then().

Gestion d'erreurs

Mot-cléDescription
tryBloc de code à essayer
catch (err)Gère l'erreur si elle survient
finallyS'exécute toujours (avec ou sans erreur)
throwLance une erreur personnalisée
JavaScript
try {
    const data = JSON.parse(input);
} catch (err) {
    console.error("JSON invalide:", err.message);
} finally {
    console.log("Toujours exécuté");
}

// Lancer une erreur
function diviser(a, b) {
    if (b === 0) {
        throw new Error("Division par zéro !");
    }
    return a / b;
}

// Types d'erreurs
throw new TypeError("Type incorrect");
throw new ReferenceError("Variable non définie");
throw new RangeError("Valeur hors limites");
throw new SyntaxError("Syntaxe incorrecte");
Bonnes pratiques

N'utilisez jamais try/catch pour contrôler le flux. Utilisez-le uniquement pour les erreurs imprévues (réseau, JSON, accès DOM). Toujours catcher les erreurs dans les fonctions async.

Syntaxe & Variables — Lua 5.4

Lua est un langage léger, interprété et dynamiquement typé. Les variables sont déclarées avec local (recommandé) ou globalement.

SyntaxeDescriptionExemple
local x = 10Variable locale (portée de bloc)local nom = "Lua"
x = 10Variable globale (à éviter)global_var = 42
local a, b = 1, 2Assignation multiplelocal x, y, z = 1, "a", true
local a, b = f()Plusieurs retourslocal r, g, b = getColor()
Lua
-- Variables locales (recommandé)
local nom = "CodeAcademy"
local age = 25
local estActif = true

-- Assignation multiple
local x, y, z = 1, 2, 3

-- Sans valeur = nil
local vide -- vide == nil

-- Règles de nommage
local monNom = "OK"      -- snake_case
local _prive = 42        -- commence par _
-- local 2chiffres = 1  -- ERREUR : ne commence pas par une lettre

Types de données — Lua 5.4

Lua possède 8 types de données. La fonction type() retourne le type sous forme de chaîne.

TypeDescriptionExemple
nilAbsence de valeur (défaut)local x = nil
booleantrue ou falselocal b = true
numberEntiers et flottants (Lua 5.4 distingue)local n = 42 / local f = 3.14
stringSéquence de caractères (immuable)local s = "bonjour"
functionFonction Lua ou Clocal f = function() end
tableTable associative (tableau/dictionnaire)local t = {1, 2, 3}
userdataDonnées C enrobéesio.open(...)
threadCoroutinecoroutine.create(fn)
Lua
print(type(nil))        -- "nil"
print(type(true))       -- "boolean"
print(type(42))         -- "number"
print(type("bonjour"))  -- "string"
print(type(print))     -- "function"
print(type({}))         -- "table"

-- Conversions
local n = tonumber("42")     -- 42 (number)
local s = tostring(3.14)     -- "3.14" (string)

-- Lua 5.4: integer vs float
print(math.type(42))    -- "integer"
print(math.type(3.14))   -- "float"

Opérateurs — Lua 5.4

CatégorieOpérateursDescription
Arithmétique+ - * / // % ^Addition, soustraction, multiplication, division, division entière, modulo, puissance
Comparaison== ~= < > <= >=Égalité, inégalité, comparaisons
Logiqueand or notET, OU, NON (pas de symboles && || !)
Concaténation..Joint deux chaînes : "a" .. "b""ab"
Longueur#Longueur d'une chaîne ou d'un tableau
Lua
-- Division entière (Lua 5.3+)
print(17 // 5)   -- 3 (truncated)
print(17 % 5)    -- 2 (reste)

-- Concaténation
print("Bonjour" .. " " .. "Lua")  -- "Bonjour Lua"

-- Longueur
print(#"bonjour")   -- 6
print(#{1, 2, 3})     -- 3

-- Puissance
print(2 ^ 8)    -- 256

Conditions — Lua 5.4

SyntaxeDescription
if cond then ... endCondition simple
if ... elseif ... else ... endConditions multiples
cond and v1 or v2Ternaire (pas d'opérateur ? :)
Valeurs "fausses" : Seuls false et nil sont considérés comme faux. 0, "" et {} sont VRAIS !
Lua
local score = 85

if score >= 90 then
    print("Excellent")
elseif score >= 70 then
    print("Bien")
elseif score >= 50 then
    print("Passable")
else
    print("Échec")
end

-- Ternaire avec and/or
local age = 20
local statut = age >= 18 and "Majeur" or "Mineur"

Boucles — Lua 5.4

SyntaxeDescription
for i = start, stop, step do ... endBoucle numérique
for k, v in pairs(t) do ... endParcourt un dictionnaire (clé-valeur)
for i, v in ipairs(t) do ... endParcourt un tableau ordonné (1-indexed)
while cond do ... endTant que la condition est vraie
repeat ... until condRépète jusqu'à ce que la condition soit vraie
breakSort de la boucle la plus proche
goto label ::label::Saute vers un label dans le même bloc
Lua
-- For numérique
for i = 1, 10 do
    print(i)
end

-- For avec pas
for i = 10, 1, -1 do
    print(i)  -- 10, 9, 8, ... 1
end

-- pairs() pour dictionnaires
local fruits = {pomme="rouge", banane="jaune"}
for k, v in pairs(fruits) do
    print(k, v)
end

-- repeat/until
local x = 0
repeat
    x = x + 1
until x >= 5

Fonctions — Lua 5.4

SyntaxeDescription
function nom() ... endDéclaration de fonction
return a, bRetourne plusieurs valeurs
function(...)Arguments variables (vararg)
local f = function() endFonction anonyme stockée dans une variable
Lua
-- Fonction simple
local function somme(a, b)
    return a + b
end

-- Plusieurs retours
local function minmax(t)
    return math.min(table.unpack(t)), math.max(table.unpack(t))
end
local a, b = minmax({3, 1, 4, 1, 5})  -- 1, 5

-- Closure
local function makeCounter()
    local n = 0
    return function()
        n = n + 1
        return n
    end
end
local c = makeCounter()
print(c())  -- 1
print(c())  -- 2

Tables — Lua 5.4

Les tables sont la SEULE structure de données en Lua (tableaux, dictionnaires, objets, modules...).

Important : Les tableaux Lua commencent à l'indice 1 (pas 0 comme en C/JS).
FonctionDescriptionExemple
table.insert(t, v)Ajoute v à la fintable.insert(fruits, "kiwi")
table.insert(t, i, v)Insère v à l'indice itable.insert(fruits, 1, "pomme")
table.remove(t, i)Supprime l'élément à l'indice itable.remove(fruits, 2)
table.sort(t)Trie le tableau en placetable.sort(nombres)
table.concat(t, sep)Joint les éléments en chaînetable.concat({"a","b"}, "-")"a-b"
table.pack(t)Empaquette en tableau avec .ntable.pack(1, 2, 3)
table.unpack(t)Dépaquette en valeurstable.unpack({1,2,3})1, 2, 3
Lua
-- Tableau (array)
local fruits = {"pomme", "banane", "kiwi"}
print(fruits[1])   -- "pomme" (indice 1 !)
print(#fruits)     -- 3

-- Dictionnaire (hash)
local joueur = {nom = "Hero", vie = 100, niveau = 5}
print(joueur.nom)   -- "Hero"

-- Parcours
for i, v in ipairs(fruits) do    -- tableaux ordonnés
    print(i, v)
end

for k, v in pairs(joueur) do  -- dictionnaires
    print(k, v)
end

Strings — Lua 5.4

FonctionDescriptionExemple
string.sub(s, i, j)Extrait une sous-chaînestring.sub("bonjour", 1, 3)"bon"
string.find(s, pattern)Cherche un patternstring.find("abc", "b")2, 2
string.gsub(s, pat, rep)Remplace toutes les occurrencesstring.gsub("a-b", "-", "_")"a_b"
string.format(fmt, ...)Formate une chaînestring.format("%.2f", 3.14)"3.14"
string.rep(s, n)Répète n foisstring.rep("ab", 3)"ababab"
string.reverse(s)Inverse la chaînestring.reverse("bonjour")"ruojnob"
string.upper(s)Majusculesstring.upper("bonjour")"BONJOUR"
string.lower(s)Minusculesstring.lower("BONJOUR")"bonjour"
string.len(s)Longueurstring.len("bonjour")6
string.match(s, pattern)Première correspondancestring.match("abc123", "%d+")"123"
string.gmatch(s, pattern)Itérateur de correspondancesVoir code ci-dessous
Lua
-- Formatage
print(string.format("Score: %d/%d (%.1f%%)", 85, 100, 85.0))

-- Multi-lignes
local texte = [[
Ceci est
une chaîne
multi-lignes
]]

-- Itérateur avec gmatch
for mot in string.gmatch("bonjour le monde", "%S+") do
    print(mot)
end

Métatables — Lua 5.4

Les métatables permettent de redéfinir le comportement des opérateurs et de créer de l'héritage.

MétaméthodeÉvénementExemple
__indexClé introuvablemt.__index = function(t, k) ... end
__newindexÉcriture clé inexistantemt.__newindex = function(t, k, v) ... end
__addOpérateur +mt.__add = function(a, b) ... end
__subOpérateur -mt.__sub = function(a, b) ... end
__mulOpérateur *mt.__mul = function(a, b) ... end
__tostringprint() / tostring()mt.__tostring = function(t) return "..." end
__callAppel de tablemt.__call = function(t, ...) ... end
__lenOpérateur #mt.__len = function(t) return ... end
Lua
-- __index pour hériter des méthodes
local AnimalBase = {}
AnimalBase.__index = AnimalBase

function AnimalBase:nouveau(nom)
    local obj = {nom = nom}
    setmetatable(obj, self)
    return obj
end

function AnimalBase:parler()
    print("Je suis " .. self.nom)
end

-- __add pour additionner deux objets
local Vec = {__add = function(a, b)
    return {x = a.x + b.x, y = a.y + b.y}
end}

Coroutines — Lua 5.4

Les coroutines sont des fonctions coopératives qui peuvent être suspendues et reprises.

FonctionDescription
coroutine.create(fn)Crée une coroutine
coroutine.resume(co, ...)Reprend / lance la coroutine
coroutine.yield(...)Suspend la coroutine
coroutine.status(co)Retourne "suspended", "running", "dead" ou "normal"
coroutine.wrap(fn)Crée une fonction qui resume la coroutine
coroutine.running()Retourne la coroutine en cours d'exécution
Lua
-- Coroutine basique
local co = coroutine.create(function()
    print("Début")
    coroutine.yield(42)
    print("Reprise")
    return "fin"
end)

print(coroutine.resume(co))   -- true, 42
print(coroutine.status(co))   -- "suspended"
print(coroutine.resume(co))   -- true, "fin"

-- Générateur avec coroutine.wrap
local function nombres(n)
    return function()
        for i = 1, n do
            coroutine.yield(i)
        end
    end
end

Modules — Lua 5.4

FonctionDescription
require("nom")Charge et retourne le module
package.loaded["nom"]Cache des modules chargés
package.pathChemin de recherche des modules Lua
Lua
-- utils.lua (fichier module)
local utils = {}

function utils.greet(nom)
    return "Bonjour, " .. nom .. " !"
end

function utils.add(a, b)
    return a + b
end

return utils

-- main.lua (fichier principal)
local utils = require("utils")
print(utils.greet("Lua"))
print(utils.add(2, 3))

Nouveautés Lua 5.5

Lua 5.5 introduit des améliorations majeures pour la gestion des ressources et la constance.

FonctionnalitéDescriptionExemple
<const>Attribut de constance sur variables et fonctionslocal <const> x = 10
<close>Fermeture automatique à la sortie du scopelocal <close> f = io.open(...)
__closeMétaméthode appelée par <close>mt.__close = function(t) ... end
Améliorations gotoLabels et sauts améliorés::label:: ... goto label
Meilleures erreursMessages d'erreur avec traceback amélioréxpcall(f, debug.traceback)

Attribut <const> — Lua 5.5

L'attribut <const> empêche la réassignation d'une variable ou le remplacement d'une fonction.

Note : <const> empêche la réassignation de la RÉFÉRENCE, pas la modification des champs d'une table.
SyntaxeDescription
local <const> x = 10Constante : x = 20 provoquera une erreur
local <const> function f() endFonction constante : f = nil provoquera une erreur
local <const> t = {}La table est constante, mais t.x = 1 fonctionne
Lua
local <const> PI = 3.14159
local <const> NOM = "CodeAcademy"
local <const> config = {debug = true}

-- Ceci PROVOQUE une erreur :
-- PI = 3.0          -- ERREUR: attempt to reassign a constant
-- NOM = "Autre"     -- ERREUR

-- Ceci FONCTIONNE (la table est mutable) :
config.debug = false     -- OK
config.prod = true         -- OK

-- Fonction constante
local <const> function add(a, b)
    return a + b
end

Attribut <close> — Lua 5.5

L'attribut <close> appelle automatiquement __close quand la variable sort de son scope. C'est le mécanisme de "to-be-closed".

SyntaxeDescription
local <close> f = io.open("f.txt")Ferme automatiquement le fichier à la sortie du bloc
__close metamethodPersonnalise le comportement de fermeture
Comparable à try/finally dans d'autres langages. La ressource est toujours libérée, même en cas d'erreur.
Lua
-- Gestion automatique de fichier
do
    local <close> f = io.open("data.txt", "r")
    if f then
        local contenu = f:read("*a")
        print(contenu)
    end
end  -- f est automatiquement fermé ici !

-- Même en cas d'erreur, le fichier est fermé
do
    local <close> f = io.open("log.txt", "w")
    f:write("début\n")
    error("une erreur !")  -- f quand même fermé
end

-- __close personnalisé
local Lock = {__close = function(self)
    print("Lock libéré: " .. self.nom)
end}

do
    local <close> mutex = setmetatable({nom = "db_lock"}, Lock)
    print("Section critique")
end  -- "Lock libéré: db_lock"

Générateurs — Lua 5.5

Les générateurs produisent une séquence de valeurs à la demande, souvent via des coroutines.

Lua
-- Générateur de Fibonacci
local function fib(n)
    return coroutine.wrap(function()
        local a, b = 0, 1
        for i = 1, n do
            coroutine.yield(a)
            a, b = b, a + b
        end
    end)
end

for v in fib(10) do
    print(v)  -- 0, 1, 1, 2, 3, 5, 8, 13, 21, 34
end

-- Générateur infini de nombres premiers
local function primes()
    return coroutine.wrap(function()
        local n = 2
        while true do
            local estPremier = true
            for i = 2, math.sqrt(n) do
                if n % i == 0 then estPremier = false; break end
            end
            if estPremier then coroutine.yield(n) end
            n = n + 1
        end
    end)
end

Gestion d'erreurs — Lua 5.5

FonctionDescription
pcall(f, ...)Appel protégé : retourne true+résultats ou false+erreur
xpcall(f, handler)pcall avec gestionnaire d'erreur personnalisé
error(msg)Lève une erreur avec un message
assert(v, msg)Vérifie une condition, lève une erreur si fausse
debug.traceback()Retourne une traceback (pour xpcall)
Lua
-- pcall basique
local ok, err = pcall(function()
    error("une erreur")
end)
print(ok, err)  -- false  "une erreur"

-- xpcall avec traceback
local ok2, err2 = xpcall(function()
    error({code = 404, msg = "Non trouvé"})
end, function(e)
    return tostring(e.code) .. ": " .. e.msg
end)
print(ok2, err2)  -- false  "404: Non trouvé"

-- assert
local age = -1
assert(age >= 0, "L'âge ne peut pas être négatif")  -- erreur si fausse

Patterns — Lua 5.5

Lua utilise des patterns natifs (pas des regex) pour la manipulation de chaînes.

ClasseSignificationExemple
%aLettre (alphabétique)string.match("abc", "%a+")"abc"
%dChiffrestring.match("abc123", "%d+")"123"
%wLettre ou chiffrestring.match("a1b2", "%w+")
%sEspace blancstring.match("a b", "%s")" "
%lLettre minusculestring.match("Hello", "%l+")"ello"
%uLettre majusculestring.match("Hello", "%u")"H"
.Tout caractèrestring.match("abc", "a.")"ab"
[abc]Classe de caractèresstring.match("x", "[xyz]")
[^abc]Négation de classestring.match("a", "[^xyz]")"a"
()Capturestring.match("a=1", "(%a)=(%d)")"a", "1"
Lua
-- Extraction
local email = "Contact: jean@mail.com"
local addr = string.match(email, "[%w%.]+@[%w%.]+")
print(addr)  -- "jean@mail.com"

-- Itération
for nb in string.gmatch("Il y a 3 chats et 5 chiens", "%d+") do
    print(nb)  -- "3", puis "5"
end

-- Remplacement avec fonction
local resultat = string.gsub("bonjour le monde", "%a+", function(w)
    return string.upper(w: sub(1,1)) .. w: sub(2)
end)
print(resultat)  -- "Bonjour Le Monde"

Performance — Lua 5.5

TechniqueDescriptionImpact
table.concatJoindre > concaténation .. en boucleBeaucoup plus rapide (1 allocation vs n)
Variables localesLocales > globals (upvalue vs global lookup)~30% plus rapide
UpvaluesFonctions qui capturent des variables localesPlus rapide que les globals
string.formatPréférer au .. pour les constructions complexesPlus lisible et légèrement plus rapide
Métatables légersÉviter __index trop complexesImpact sur les accès fréquents
Lua
-- ❌ LENT : concaténation en boucle
local s = ""
for i = 1, 10000 do
    s = s .. tostring(i) .. ", "
end

-- ✅ RAPIDE : table.concat
local t = {}
for i = 1, 10000 do
    t[i] = tostring(i)
end
local s = table.concat(t, ", ")

-- ✅ Utiliser les locales dans les boucles serrées
local sin = math.sin  -- cache en upvalue
for i = 1, 1000 do
    sin(i)
end

Bienvenue