BRE03

JavaScript : Présentation du module et structures de contrôle

Les contenus du cours BRE03 Web Dev Course © 2024 par Mari Doucet sont sous licence CC BY-NC-SA 4.0

Introduction

Jusqu’ici, dans le cadre du cours (hors remise à niveau) vous avez fait des langages de balisage (HTML + CSS) mais pas de programmation au sens strict. Aujourd’hui, on va donc rentrer dans le vif du sujet et commencer à développer. Commençons par revoir quelques fondamentaux.

C’est quoi un ordinateur ?

Si on prend le struct minimum, un ordinateur, c’est une machine à calculer (le processeur) à qui on ajoute une mémoire à court terme (la RAM) et une mémoire à long terme (le Disque Dur).

Comme l’ordinateur est quand même souvent manipulé par des humains, on lui ajoute des périphériques d’entrée (clavier, souris, …) pour que l’humain lui parle. On lui ajoute aussi des périphériques de sortie (écran, haut-parleurs) pour qu’il parle à l’humain.

Le processeur

Le processeur ne comprend que deux choses : il y a une impulsion électrique ou bien, il n’y en a pas. Vrai ou Faux. Oui ou Non. Quand on l’écrit on le représente par des séries de 1 et de 0. Ça s’appelle le binaire. Nous devons donc trouver un moyen d’envoyer du binaire au processeur sans devoir intégralement le taper à la main. Il nous faut donc une forme de traduction.

Les langages de programmation

Ça tombe bien, il existe tout plein de techniques de traduction. On appelle ça des langages de programmation.

Au plus bas niveau par exemple, on a ce qu’on appelle le langage assembleur :

SECTION .data  
msg:  
 db "Hello World!\n"  
 len equ $ - msg  
SECTION .text  
 global start  
start:  
 mov edx,len  
 mov ecx,msg  
 mov ebx,1  
 mov eax,4  
 int 0x80  
 mov ebx,0  
 mov eax,1  
 int 0x80

Chaque modèle de processeur a son propre langage assembleur, ici, c’est un exemple pour un processeur Intel.

Ce n’est pas forcément très souple ni facile à apprendre, on a donc créé des langages qui vont être traduits vers l’assembleur, parmi lesquels, le langage C :

#include <stdio.h>  

int main(void)  
{  
 printf("Hello World!\n");  
 return 0;  
}

Puis, on a trouvé que le C était trop rigide ou trop limité et on a inventé le C++ qui sera traduit vers le C :

#include <iostream>  

int main()  
{  
 std::cout << "Hello World!\n";  
}

Puis, on a utilisé C++ (qui est donc traduit en C qui est traduit en assembleur) pour créer un moteur qui allait interprêter un nouveau langage que l’on allait utiliser sur les pages Web : le JavaScript :

console.log("Hello World!");

Le Web

C’est quoi le dev web ?

La particularité principale du développement web par rapport à d’autres types de développement, c’est que votre utilisateur n’installera jamais votre site web. Il n’aura pas un .exe ou un .dmg ou que sais-je. Votre travail, il le verra via un navigateur.

Ce navigateur est un client qui ira demander les informations de votre site à un serveur.

Clients et serveurs

Internet, en très gros, c’est un énorme paquet d’ordinateurs. Chacun de ces ordinateurs peut théoriquement héberger un certain nombre de sites internets (en réalité, ils ne le font pas tous, ou certains n’en hébergent qu’un).

Un ordinateur que l’on peut interroger à distance, on appelle généralement ça un serveur. Et ce qui vous sert à interroger un serveur, c’est un client (votre navigateur donc).

Requêtes et réponses

Pour interroger un serveur, on lui envoie une requête. Il y a un vocabulaire particulier, qu’on appelle le protocole HTTP pour ça. Vous vous ne le voyez pas, vous tapez simplement une requête dans votre moteur de recherche ou une adresse dans une barre d’URL.

Mais votre navigateur lui va transformer vos actions en une requête formatée pour le protocole HTTP et va envoyer cette requête au serveur.

Et le serveur va lui envoyer une réponse, elle aussi répondant au format HTTP. Parfois, vous pouvez vous en rendre compte. Par exemple, 404 est le code HTTP pour “qu’est-ce que tu racontes ça existe pas ton truc” plus poliment abrégé en “Not found”.

Quand tout se passe bien le code de réponse, c’est le code 200 et le serveur vous envoie ce que vous avez demandé. Un fichier, une image, du JSON etc, etc. L’immense majorité du temps le serveur vous renvoie du HTML. Et c’est ce HTML que vous lisez ensuite.

Les méthodes HTTP

Il existe 4 grands types de requêtes HTTP :

GET

On demande une ressource au serveur, parfois en lui envoyant des paramètres directement dans l’URL de la requête.

GET c’est “je veux voir ça”.

POST

On envoie des ressources aux serveurs qui n’apparaissent pas dans l’URL de la requête.

POST c’est “je veux créer ça”

PATCH

On envoie des infos au serveur dans le but de modifier partiellement une ressource.

PATCH c’est “je veux modifier ça”

DELETE

On envoie des infos au serveur pour supprimer une ressource

DELETE c’est “je veux effacer ça”

Les réponses HTTP

La liste complète : https://fr.wikipedia.org/wiki/Liste_des_codes_HTTP

200

OK.

500

Erreur serveur.

301 et 302

Redirection.

403

La ressource existe, mais vous n’avez pas le droit d’y accéder.

404

La ressource n’existe pas

418

Je suis une théière.

Le JavaScript

À quoi ça sert ?

À plein de choses, mais principalement à animer les contenus d’une page web.

Lorsque vous recevez le contenu HTML + CSS de votre page, il est fixe, il ne changera plus, l’inté est jolie.

Oui, mais voilà, vous aimez pouvoir filtrer des produits sans devoir attendre que tout le dialogue client > serveur se refasse.

Vous aimez que votre chat soit maintenu à jour alors que votre interlocuteur ou interlocutrice est en train de taper.

C’est là que JavaScript intervient. Il dynamise les contenus, coté client. Il fait de jolies animations, vous permet de faire des zooms sur des cartes ou des images, de filtrer des listes de mettre à jour des contenus sans que vous ayez à faire de requête.

À quoi ça ressemble ?

Ça peut par exemple ressembler à ça (c’est la fonction pour déplacer un personnage sur la gauche dans un jeu en JS) :

function moveLeft(character)
{
    if(character.posX > 1)
    {
        let newBox = document.querySelector("section.col-start-" + (character.posX - 1) + ".row-start-" + character.posY);

        if(canIMoveThere(newBox))
        {
            let currentBox = document.querySelector("section.col-start-" + character.posX + ".row-start-" + character.posY);
            newBox.classList.add("character");
            currentBox.classList.remove("character");
            character.posX--;
            localStorage.setItem("character", JSON.stringify(character));
        }
    }
}

Ça peut aussi ressembler à ça (quand on clique sur le bouton, une fenêtre nous dit bonjour) :

button.addEventListener("click", function() {
  window.alert("Hello!");
});

Comment tester ?

Comment on teste en Javascript ? On utilise une fonction appelée console.log()

console.log("Coucou c'est moi");

affichera “Coucou c’est moi” dans la console des outils de développement de votre navigateur.

Variables et types

C’est quoi une variable ?

Une variable en programmation, c’est une sorte de boite dans laquelle on met une valeur et que l’on va pouvoir promener pour la manipuler.

Un exemple : quand on fait des calculs pour de la génération d’image de synthèse, on a souvent des calculs complexes, équations du troisième degré etc, etc. Plutôt que de devoir refaire le calcul à chaque fois, on le stocke dans une variable et on se sert directement de cette variable qui contient le résultat.

C’est quoi un scope ?

Un scope (ou portée en français) c’est la “zone de code” dans laquelle une variable existe, quel que soit le type de cette variable.

Une variable peut être globale ou bien limitée à une fonction ou encore limitée à une condition.

Déclarer une variable

Pour déclarer une variable en JavaScript vous avez trois options :

let

let animal = "Dog"; // la variable animal contient Dog

let permet de déclarer une variable muable, c’est-à-dire que l’on pourra changer sa valeur :


let age1 = 12;
let age2 = 13;

let averageAge = (age1 + age2) / 2;

let age3 = 20;

averageAge = (age1 + age2 + age3) / 3; // pas besoin de remettre let la variable est déjà déclarée

const

const name = "Yep";

Lorsqu’une variable est déclarée avec const c’est que l’on veut qu’elle soit immuable. Sa valeur est constante et ne changera pas.

const name = "Yep";
name = "Nope"; // provoquera une erreur, on ne peut pas modifier une variable const

var

Vous ne devez pas utiliser var. Si ce mot clé fonctionne sur le même principe que let il est aujourd’hui une mauvaise pratique, et c’est lié au scope. var créé des variables aux scopes très larges, elles existent donc partout et peuvent très facilement être modifiées par erreur.

On lui préfère donc let qui limite le scope de la variable aux accolades qui l’entourent.

Tester ses variables

Pour tester des variables, on utilise toujours console.log() et on a deux techniques possibles

Affichage simple

let name = "Yep";
console.log(name); // Affichera Yep

Vous donnez simplement le nom de la variable que vous avez déclarée et console.log affichera sa valeur.

Injection

Parfois, on a plusieurs données et on veut localiser très vite dans ses logs des valeurs, ou bien des rapports entre les valeurs. On utilise donc l’injection des variables dans une chaine de caractères.

let name = "Yep";
let age = 18;

console.log(`My name is ${name} and I am ${age} years old`); // affichera My name is Yep and I am 18 years old

Interagir avec l’utilisateur

window.prompt

En utilisant window.prompt(), vous allez pouvoir ouvrir une fenêtre qui demande une info à l’utilisateur :

let name = window.prompt("Comment vous appelez-vous ?");

window.alert

En utilisant window.alert()vous allez pouvoir ouvrir une petite fenêtre qui transmet une information à l’utilisateur :

window.alert("Coucou !");

Les types de variables

Pour commencer, nous allons principalement utiliser trois grands types de variables :

String

Les chaines de caractères ou String sont tout simplement des textes.

let name = "Yep" // name est de type String

Number

Les nombres et les chiffres sont représentés par le type Number, qu’ils soient entiers ou décimaux, positifs ou négatifs.

let x = 345; // x est de type Number
let y = -67; // y est de type Number
let z = 4.23; // z est de type Number

Boolean

Enfin les booléens représentent un état purement binaire, ils peuvent être soit true soit false.

let truth = true; // truth est un boolean
let lie = false; // lie est un boolean

Opérateurs arithmétiques

C’est quoi un opérateur arithmétique ?

C’est ce qui permet de faire une opération mathématique.

Addition

let x = 4 + 5; // x est égal à 9

Soustraction

let x = 5 - 4; // x est égal à 1

Multiplication

let x = 5 * 4; // x est égal à 20

Division

let x = 20 / 4; // x est égal à 5

Modulo

Un modulo, c’est le reste d’une division euclidienne.

let x = 3 / 2; // x est égal à 1,5 mais ramené à l'entier x égal à 1
let y = 3 % 2; // y est égal à 1

Parenthèses

let x = (3 + 4) * 2; // x est égal à 14
let y = 3 + 4 * 2; // y est égal à 11

Exercice de manipulation des variables et des types

Sujet de l’exercice

Les comparaisons

Expression booléenne

Une expression booléenne, c’est une expression dont le résultat peut-être soit true, soit false.

let equal = (2 === 2); // equal va contenir true
let unequal = (2 === 3); // unequal va contenir false

C’est particulièrement utile pour faire des comparaisons.

Les comparaisons

===

Permet de vérifier si une chose est égale à une autre.

let name = "Yep";

let equal = (name === "Yep"); // equal vaudra true
let unequal = (name === "Nope"); // unequal vaudra false

!==

Permet de vérifier si une chose n’est pas égale à une autre.

let name = "Yep";

let equal = (name !== "Nope"); // equal vaudra true
let unequal = (name !== "Yep"); // unequal vaudra false

>

Permet de vérifier qu’une valeur est supérieure à une autre.

let x = 4;
let y = 1;

let yes = (x > y); // 4 > 1 donc yes vaudra true
let no = (y > x); // 1 < 4 donc no vaudra false

<

Permet de vérifier qu’une valeur est inférieure à une autre.

let x = 1;
let y = 4;

let yes = (x < y); // 1 < 4 donc yes vaudra true
let no = (y < x); // 4 > 1 donc no vaudra false

>=

Permet de vérifier qu’une valeur est supérieure ou égale à une autre.

let x = 4;
let y = 1;
let z = 4;

let yes = (x >= y); // yes vaudra true
let no = (y >= x); // no vaudra false
let maybe = (x >= z); // maybe vaudra true

<=

Permet de vérifier qu’une valeur est inférieure ou égale à une autre.

let x = 2;
let y = 4;
let z = 2;

let yes = (x <= y); // yes vaudra true
let no = (y <= x); // no vaudra false
let maybe = (x <= z); // maybe vaudra true

ET logique

Un ET logique permet de vérifier si deux comparaisons renvoient toutes les deux true.

let x = 5;
let y = 2;
let z = 3;

let yes = ((x > 2) && (z < 3)); // yes vaudra true
let no = ((x > 5) && (z < 2)); // no vaudra false

OU logique

Un OU logique permet de vérifier si au moins une de deux comparaisons renvoie true.

let x = 5;
let y = 2;
let z = 3;

let yes = ((x > 2) || (z < 3)); // yes vaudra true
let maybe = ((x >= 5) || (z < 2)); // maybe vaudra true
let no = ((x > 5) || (z < 2)); // no vaudra false

Les conditions

Lorsque l’on a besoin d’affiner le comportement de son code, on utilise souvent des conditions. Une condition ça utilise le résultat d’une expression booléenne ou d’une comparaison pour déterminer le comportement du code.

if

Une condition if cela équivaut à dire, si l’expression entre parenthèse donne true alors fait ça.

let age = 24;

if(age > 18) // si l'age est supérieur à 18
{
	console.log("Majeur"); // alors affiche Majeur
}

else

Une condition else cela équivaut à dire sinon, par rapport à l’if précédent.

let age = 24;

if(age > 18) // si l'age est supérieur à 18
{
	console.log("Majeur"); // alors affiche Majeur
}
else // sinon
{
	console.log("Mineur"); // affiche Majeur
}

else if

Une condition else if permet de nuancer entre un if et un else. C’est l’équivalent d’un “sinon si”.

let age = 37;

if(age < 25) // si l'age est inferieur à 25
{
	console.log("Réduction junior");
}
else if(age >=25 && age < 60) // sinon si l'age est entre 25 et 60
{
	console.log("Pas de réduction");
}
else // sinon
{
	console.log("Réduction senior")
}

La boucle while

En programmation, lorsque nous voulons répéter une action, nous pouvons l’insérer dans une boucle.

while

Une boucle while c’est une boucle qui s’éxécute tant que la condition est true.

let i = 0;

while(i < 5) // tant que i est inferieur à 5
{
	console.log(i); // affiche i
	i = i + 1; // ajoute 1 à i
}

Si la condition est toujours vraie, vous aurez une boucle infinie et ça, c’est à éviter (ça bloque votre programme et votre navigateur).

Nous verrons les autres boucles en JavaScript, for et forEach plus tard dans le cours sur les tableaux.

Exercices de manipulation des boucles et des conditions

Sujets des exercices

Mini-projet : le nombre mystère

Ici, vous avez deux sujets différents pour le mini-projet : un sujet où les étapes sont découpées pour vous aider à progresser dans le projet et l’autre où vous avez simplement les consignes et à vous de jouer.

Le sujet guidé

Le sujet sans aide