JavaScript - Les bases

Nous allons désormais attaquer JavaScript !

JavaScript est un langage ayant vu le jour en 1995 par Brendan Eich, qui s’est inspiré de la syntaxe du Java (notamment) et a mis dix jours pour créer ce langage.

Au fil des ans, ce langage s’est enrichi de nombreuses fonctionnalités, et, aujourd’hui, une large communauté de développeurs et de développeuses travaille à le faire évoluer dans le bon sens.

Dans ce cours, nous allons voir les bases de JavaScript : comment déclarer des variables, les fonctions, les instructions de conditions et de boucles. Dans les cours suivants nous verrons les objets et les tableaux, puis nous commencerons à voir comment manipuler le DOM, pour proposer aux utilisateurs et utilisatrices des comportement plus dynamiques.

Où tester mon code ?

Dans un premier temps, nous allons écrire nos morceaux de code directement dans la console du navigateur : cela nous permettra de bien prendre en main JavaScript sans avoir à développer de site web. Vous pouvez également utiliser le site https://runjs.co/ pour vos essais.

Les variables

Comme vous avez pu le voir en PHP, il est également possible, en JavaScript, de déclarer des variables.

Le mot-clef var

Le mot-clef var permet de déclarer des variables. Aujourd’hui, son utilisation n’est plus recommandée, à cause d’effets de bord qu’elle peut causer. Nous verrons plus tard pourquoi.

Les mot-clefs let et const

Nous utiliserons ces mot-clefs dans ce cours. Ils permettent respectivement de créer une variable et une constante.

Voici un exemple :

let age = 18;
const name = 'toto';

Dans cet exemple, nous créons une variable et une constante : age pourra recevoir de nouvelles valeurs, car il s’agit d’une variable. En revanche, name ne pourra pas recevoir de nouvelle valeur, car il s’agit d’une constante.

De manière générale, on aura tendance à n’utiliser les let que si la valeur est amenée à changer au cours de l’exécution du programme.

Les types de valeurs

Qui dit variable, dit valeur !

En JavaScript, il existe plusieurs types de valeurs. Ceux qui nous intéresseront pour ce cours seront les suivant :

  • le type Number (entiers ou flottants) ;
  • les chaînes de caractères (ou string) ;
  • les booléens (true / false) ;
  • le type null ;
  • le type undefined ;
  • le type Object.

Les cinq premiers sont ce que l’on appelle des types primitifs : vous pouvez voir cela comme étant des types de base, relativement simples.

Parmi ces types primitifs, null et undefined sont un peu particuliers. Le type null ne correspond qu’à une seule valeur : la valeur null. Le type undefined correspond à la valeur que porte une variable avant qu’on lui affecte une quelconque valeur.

Exemple :

let age;
age = 18;
age = null;

À la première ligne, nous déclarons une variable nommée age. Aucune valeur ne lui a encore été affectée, elle vaut donc undefined car elle est indéfinie. À la deuxième ligne, nous affectons une valeur à cette variable : à ce moment-là, age porte la valeur 18 et est de type Number. À la troisième ligne, nous lui affectons la valeur null : dans ce cas là, age reste définie, et elle ne vaut simplement rien.

Enfin, le type Object. Il s’agit d’un type non-primitif, car permettant de représenter des structures plus complexes. Nous reviendrons dessus plus loin dans le cours.

Les différences en let et const

Au final, il existe peu de différences entre let et const. Le tableau suivant suffit à les résumer.

  let const
Réaffecter des valeurs oui non
Déclarer sans affecter de valeur oui non

Récapitulatif des types

De même, voici un tableau récapitulatif des types présentés précédemment

type valeurs acceptées
number nombres entiers et flottants
string chaînes de caractères
boolean true / false
null null
undefined undefined
object des structures complexes

Les instructions de conditions

On les retrouve dans quasiment tous les langages : les instructions de conditions. Elles permettent tout simplement d’exécuter un bloc de code si une condition est respectée. Vous les avez déjà vues en PHP : if et else. En JavaScript, il existera également le else if accolé.

Voici un exemple :

const age = 17;
if (age >= 18) {
	// faire quelque chose
} else if (age >= 16) {
	// faire autre chose
} else {
	// si aucune condition n'a été respectée, on passe ici
}

Dans cet exemple, nous déclarons une constante et lui affectons la valeur 17. Puis nous effectuons un test :

  • est-ce que la valeur est supérieure ou égale à 18 ?
  • si non, est-ce que la valeur est supérieure ou égale à 16 ?
  • si non, on fait autre chose.

On peut, bien évidemment, se passer du else if et du else si on ne veut rien faire en cas de non-respect de la condition :

const age = 17;

if ( age >= 18 ) {
	// faire quelque chose
}

Exercices

Exercice 1

Dans la console de votre navigateur, ou bien sur le site https://runjs.co/, recopiez le code suivant :

function randomAge() {
  return Math.floor(Math.random() * 50);
}

const age = randomAge();

Puis, en utilisant les instructions de conditions, faites en sorte que le code suivant ne s’exécute que si l’âge généré est supérieur à 16.

console.log('Accès autorisé');

Faites ensuite en sorte que le code suivant s’exécute si la condition n’est pas respectée :

console.log('Accès non-autorisé');
Exercice 2

Toujours à partir du même morceau de code, faites maintenant en sorte que le code suivant ne s’exécute que si l’âge généré est situé entre 12 et 25 (inclus).

console.log('Elligible à la réduction 12-25');

Attention Vous les avez normalement vu en PHP : les opérateurs logiques && (“et”) et || (“ou”) permettent de combiner plusieurs conditions.

Exemple :

const toto = 'toto';
if (toto === 'toto' || toto === 'tata') {
	// faire quelque chose
}
Exercice 3

Désormais, partez du code suivant :

function throwDice() {
  return Math.floor((Math.random() * 6) + 1);
}

const dice = throwDice();

Puis, à l’aide d’une instruction de condition, faites en sorte que ce code ne s’exécute que si le résultat est égal à 3 ou 6.

console.log('win');

Les opérateurs

Dans les exemples précédents, nous avons vu, sans en parler, ce que l’on appelle des opérateurs. Il existe plusieurs types d’opérateurs :

  • les opérateurs binaires (avec deux opérandes) ;
  • les opérateurs unaires (avec une opérande) ;
  • les opérateurs ternaires (que nous verrons juste après) ;
  • les opérateurs logiques (qui sont soit binaires soit unaires) ;
  • les opérateurs d’affectation ;
  • les opérateurs de comparaison ;
  • les opérateurs arithmétiques.

Toute la liste complète peut-être trouvée ici : https://developer.mozilla.org/fr/docs/Web/JavaScript/Guide/Expressions_and_Operators.

Nous n’allons pas tous les voir aujourd’hui. Voici cependant ceux qui sont dans les exercices précédents :

opérateur type nom exemple
= affectation affectation const age = 18;
== comparaison équivalence if(age == '18') {}
=== comparaison stricte égalité if(age === '18') {}
> comparaison strictement supérieur if (age > 17) {}
>= comparaison supérieur ou égal if (age>=18) {}
< comparaison strictement inférieur if (age<18) {}
<= comparaison inférieur ou égal if (age<=17) {}
>= comparaison supérieur ou égal if (age>=18) {}
&& logique ET if (age>=18 && age <= 25) {}
|| logique OU if (age>=18 || age <= 25) {}

Les opérateur d’équivalence et de stricte égalité

En JavaScript, il est possible de faire des tests d’égalité avec les opérateurs suivants :

  • == ;
  • ===.

A priori, ces deux opérateurs reviennent au même : une comparaison entre deux valeurs. Pourtant, on préfèrera utiliser le triple égal, pour des raisons de rigueur. En effet, le double égal ne va faire qu’une équivalence, tandis que le triple fera une égalité stricte.

Exemple :

if (18 == '18') {
	console.log('équivalence');
}

if (18 === '18') {
	console.log('stricte égalité');
}

Pour éviter tout risque lié à l’équivalence, nous utiliserons la stricte égalité.

L’opérateur ternaire

L’opérateur ternaire est un peu particulier. Il n’est pas nécessaire de le comprendre dès le début, et je ne m’offusquerai pas de ne pas le voir dans vos rendus. Il s’agit d’un opérateur permettant de réduire un test if...else en une seule ligne d’instruction.

Exemple :

if (age >= 18) {
	console.log('La personne est majeure');
} else {
	console.log('La personne n\'est pas majeure');
}

devient :

(age >= 18) 
? console.log('La personne est majeure'); 
: console.log('La personne n\'est pas majeure');

Le point d’interrogation précède le code à exécuter si la condition est vraie. Les deux points précèdent le code à exécuter si la condition est fausse.

Cette notation peut parfois être confusante, c’est pourquoi on préfère parfois rester sur un simple if...else.

Les instructions de boucle

Très souvent, on doit appliquer un même traitement à une liste de valeurs, ou encore effectuer un traitement tant qu’une condition est respectée. Pour ce faire, nous utilisons ce que l’on appelle des boucles.

Nous verrons, ici, un seul type de boucles : les boucles for et, plus tard, les boucles forEach.

Voici la syntaxe d’une boucle for :

for(condition initiale; conditions d'exécution; incrémentation){
	// le code à exécuter
}

Une boucle for se déclare avec le mot-clef for, suivi de parenthèses. Dans ces parenthèses, on trouvera, séparées par des points-virgules :

  • la condition initiale : c’est le point de départ de la boucle ;
  • la ou les conditions d’exécutions : tant qu’elles sont respectées, la boucle continue de tourner ;
  • l’incrémentation, si besoin.

Pour bien illustrer l’utilisation d’une boucle for, voici un exemple :

console.log('Hello 0');
console.log('Hello 1');
console.log('Hello 2');
console.log('Hello 3');
console.log('Hello 4');
console.log('Hello 5');

Avec une boucle for, on pourra réduire le code en écrivant :

for (let i = 0; i < 5; i++) {
	console.log('Hello ' + i);
}

Exercice

En partant du code suivant, écrivez une boucle for qui permette d’afficher les éléments de la liste.

const numbersList = [0, 15, 41, 1, 11, 23, 36, 96, 48, 777, 45, -89];

Note Nous le verrons plus tard, mais pour accéder aux éléments d’un tableau T, on écrit T[indice de l'élément].

Par exemple : T[0] permettra d’accéder au premier élément du tableau T.