Introduction au Langage JavaScript
JavaScript (abrégé "JS") est un langage de programmation léger, interprété ou compilé à la volée, avec une approche fonctionnelle. JavaScript est un langage de script avancé conçu pour le web, largement utilisé dans le développement d'applications web pour ajouter diverses fonctionnalités dynamiques et offrir une expérience utilisateur plus fluide et esthétique. Typiquement, les scripts JavaScript sont intégrés directement dans du code HTML pour fonctionner.
Syntaxe de base
Syntaxe des commentaires
// Commentaire sur une seule ligne
/* Commentaire
sur plusieurs lignes */
Différentes méthodes d'inclusion de JavaScript
- Écriture directe dans les balises script
- Inclusion de fichiers JavaScript via les balises script
Les balises script peuvent être insérées n'importe où dans un document HTML. Puisque les fichiers HTML sont chargés de haut en bas, le code JavaScript peut déclarer des fonctions en haut du document ou attendre le chargement de certains éléments avant s'exécuter.
Symbole de fin de déclaration
Point-virgule ;
Note : Il est possible d'écrire des fichiers JavaScript dans l'éditeur IDE comme PyCharm
Variables et constantes
Mots-clés pour les variables : var, let
Les variables en JavaScript sont de type dynamique et ne nécessitent pas de spécification du type de données lors de leur déclaration.
> var nombre = 100
< undefined
> nombre
< 100
> let compteur = 200;
< undefined
> compteur
< 200
Dans la console du navigateur, le symbole > indique le code exécuté et < affiche la valeur de retour.
letest une syntaxe introduite dans ECMAScript 6, permettant de définir des variables locales qui n'affectent pas l'espace global, comme à l'intérieur d'une boucle.- Dans les navigateurs modernes, il est recommandé d'utiliser
letpour créer des variables.
Mots-clés pour les constantes : const
Une constante définie ne peut plus être réassignée, elle est en lecture seule.
const VALEUR = 10;
VALEUR = 11; // Erreur : Assignment to constant variable.
console.log(VALEUR); // 10
Types de données de base
L'opérateur typeof permet d'interroger le type d'une variable. typeof lui-même est un opérateur.
L'appel de l'opérateur typeof sur une variable ou une valeur retournera l'une des valeurs suivantes :
- undefined - si la variable est de type Undefined
- boolean - si la variable est de type Boolean
- number - si la variable est de type Number
- string - si la variable est de type String
- object - si la variable est un type de référence ou de type Null
Type numérique (Number)
En JavaScript, les entiers et les nombres à virgule flottante sont tous des objets Number. Nous pouvons cependant effectuer diverses opérations de conversion :
parseInt("123")convertit une chaîne de caractères numérique en entierparseFloat("123.456")convertit une chaîne de caractères numérique en nombre à virgule flottanteparseInt("abc")retourne NaN (Not a Number)
NaN (Not a Number)
NaN est un type de données numérique en JavaScript, indiquant qu'une valeur n'est pas un nombre.
Type chaîne de caractères (String)
Données entourées de guillemets simples ou doubles, utilisées pour stocker des données textuelles.
let texte1 = "formation"
let texte2 = 'js'
Il est également possible d'utiliser les chaînes de caractères modèles (template strings) :
let texte3 = `Supporte les
lignes
multiples`
let nom = 'marc', moment="maintenant";
`Bonjour ${nom}, comment vas-tu ${moment}?` // Permet l'insertion de variables
Concaténation de chaînes :
JavaScript supporte l'opérateur + pour la concaténation de chaînes, avec une efficacité raisonnable dans la plupart des cas.
Python supporte égalemetn cette opération, mais avec une efficacité moindre dans le cas de Python.
let pre = "for"
let suf = "mation"
let mot = pre + suf
console.log(mot) // formation
Méthodes courantes pour les chaînes :
| Méthode | Description | Complément |
|---|---|---|
| .length | Retourne la longueur | |
| .trim() | Retourne la chaîne sans espaces de début et de fin | Peut spécifier les caractères à supprimer |
| .trimLeft() | Retourne la chaîne sans espaces de gauche | Équivalent de .lstrip() en Python |
| .trimRight() | Retourne la chaîne sans espaces de droite | |
| .charAt(index) | Retourne le caractère à l'index spécifié | |
| .concat(value,..) | Concatène les chaînes passées en paramètre | La concaténation utilise généralement + |
| .indexOf(substring,start) | Retourne l'index de la sous-chaîne | start indique la position de recherche |
| .substring(from, to) | Extrait une sous-chaîne selon les index | Différences avec slice |
| .slice(start,end) | Extrait une sous-chaîne selon les index | |
| .toLowerCase() | Retourne la chaîne en minuscules | |
| .toUpperCase() | Retourne la chaîne en majuscules | |
| .split(delimiter,limit) | Retourne un tableau de chaînes découpées | Peut spécifier le délimiteur et la limite |
Différences entre substring et slice
string.slice(start, stop) et string.substring(start, stop) :
Points communs :
Si start égal à stop, retourne une chaîne vide
Si le paramètre stop est omis, l'extraction va jusqu'à la fin de la chaîne
Si un paramètre dépasse la longueur de la chaîne, il est remplacé par cette longueur
Caractéristiques de substring() :
Si start > stop, start et stop sont échangés
Si les paramètres sont négatifs ou non numériques, ils sont remplacés par 0
Caractéristiques de slice() :
Si start > stop, les valeurs ne sont pas échangées
Si start est négatif, l'extraction commence à la position abs(start) à partir de la fin (incluse)
Si stop est négatif, l'extraction s'arrête à la position abs(stop) à partir de la fin (exclue)
Type booléen (Boolean)
Les valeurs true et false en JavaScript sont en minuscules, ce sont des valeurs booléennes explicites.
Il existe également des valeurs booléennes implicites.
""(chaîne vide),0,null,undefined,NaNsont considérés commefalse.- Toutes les autres valeurs sont considérées comme
true.
null et undefined
nullindique l'absence de valeur intentionnelle, généralement utilisé pour assigner ou effacer une varible.undefinedindique qu'une variable a été déclarée mais n'a pas reçu de valeur, soit 1. quand une variable est déclarée mais non initialisée, 2. quand une fonction ne retourne pas explicitement de valeur.
Symbol
ES6 a introduit un nouveau type de données primitif (Symbol), représentant une valeur unique. C'est le 7ème type de données du langage JavaScript.
Objets
En JavaScript, tout est objet, y compris les types de données déjà mentionnés.
Il est possible de créer des objets personnalisés, et il existe aussi des objets intégrés comme Number/String/Date/Array qui sont fournis par JavaScript.
Un objet est simplement un type de données spécial avec des propriétés et des méthodes.
Objets tableau (Array)
De nombreux langages ont des tableaux comme type de données, et en JavaScript, un tableau peut stocker des valeurs de différents types de données consécutivement.
// Définition et accès par index
let liste = [1, 2, 3, 'bonjour']
console.log(liste[3]) // bonjour
Méthodes courantes :
| Méthode | Description | Complément |
|---|---|---|
| .length | Taille du tableau | |
| .push(ele) | Ajoute un élément à la fin | |
| .pop() | Supprime et retourne le dernier élément | |
| .unshift(ele) | Ajoute un élément au début | |
| .shift() | Supprime et retourne le premier élément | |
| .slice(start,end) | Extrait une tranche de tableau | |
| .reverse() | Inverse l'ordre des éléments | |
| .join(sep) | Joint les éléments du tableau avec un séparateur | sep est le séparateur |
| .concat(val) | Concatène plusieurs tableaux | Si val est un type de base, il est ajouté directement, sinon ses éléments sont ajoutés |
| .forEach() | Applique une fonction à chaque élément | Retourne un nouveau tableau sans modifier l'original |
| .splice() | Supprime des éléments et en ajoute de nouveaux | À connaître |
| .map() | Crée un nouveau tableau avec les résultats d'une fonction appliquée à chaque élément | Retourne un nouveau tableau sans modifier l'original |
forEach()
tableau.forEach(function(valeurCourante, index, tableau){
// code à exécuter
}, thisValue)
// function(valeurCourante, index, tableau)
valeurCourante : paramètre obligatoire, l'élément actuel
index : optionnel, l'index de l'élément actuel
tableau : optionnel, l'objet tableau auquel appartient l'élément
// thisValue
paramètre supplémentaire optionnel, passé comme valeur `this` s'il est fourni, sinon `undefined` est passé
splice()
Supprime des éléments à une position spécifique et en ajoute de nouveaux.
tableau.splice(index, combien, element1,.....,elementX)
// Paramètres
index : obligatoire. Position où commencer l'ajout/suppression. Doit être un nombre.
combien : obligatoire. Nombre d'éléments à supprimer. Doit être un nombre, peut être "0".
Si ce paramètre n'est pas spécifié, tous les éléments de l'index à la fin du tableau sont supprimés.
element1, ..., elementX : optionnels. Nouveaux éléments à ajouter au tableau
Objets personnalisés (Object)
- Création d'objets personnalisés
let utilisateur1 = new Object()
let utilisateur2 = {'nom':'marc','age':25}
- Manipulation d'objets personnalisés (ajout, suppression, modification, consultation)
// Consultation
utilisateur2['nom'] // Accès par clé sous forme de chaîne
utilisateur2.nom // Accès par propriété
// Ajout
utilisateur2['passion'] = 'programmation'
utilisateur2.sexe = 'masculin'
// Modification
utilisateur2['age'] = 26
utilisateur2.age = 27
// Suppression
delete utilisateur2.sexe // Retourne true
Opérateurs
Opérateurs arithmétiques
+ - * / % ++ --
%est l'opérateur modulo (reste de division)- Concernant
++et--, ce sont les opérateurs d'incrémentation et de décrémentation
var x=10;
var res1=x++; // res1 vaut 10
var res2=++x; // res2 vaut 12
Ce comportement s'explique par le fait que :
L'opérateur d'incrémentation après la variable assigne d'abord la valeur à la varible de destination puis incrémente ;
L'opérateur d'incrémentation avant la variable incrémente d'abord puis assigne la valeur à la variable de destination.
Opérateurs de comparaison
> >= < <= != == === !==
Il est important de noter la différence entre == et === :
==est l'égalité faible,5=='5'retourne true===est l'égalité stricte,5==='5'retourne false
!= et !== ont la même distinction.
JavaScript étant un langage à typage faible, l'opérateur == effectue des conversions de type automatiques.
Opérateurs logiques
| && | || | ! |
|---|---|---|
| ET | OU | NON |
Opérateurs d'affectation
= += -= *= /=
Contrôle de flux
Structure conditionnelle - if
if(condition1){
code à exécuter si condition1 est vraie
}else if(condition2){
code à exécuter si condition2 est vraie
}else{
code à exécuter si aucune condition n'est vraie
}
Structure conditionnelle - switch
De nombreux langages possèdent une syntaxe switch, qui a été supprimée en Python.
switch(expression){
case valeur1:
code à exécuter si expression correspond à valeur1;
break; // Sans break, les cas suivants seraient également exécutés
case valeur2:
code à exécuter si expression correspond à valeur2;
break;
...
case valeurN:
code à exécuter si expression correspond à valeurN;
break;
default:
code à exécuter si aucune valeur ne correspond;
}
Note : Les clauses case nécessitent généralement un break pour empêcher l'exécution des cas suivants
Structure de boucle - for
for(initialisation; condition; incrementation){
code de la boucle;
}
// Parcourir un tableau
for (let i = 0; i < tableau.length; i++) {
console.log(tableau[i])
}
// Parcourir un objet personnalisé
let objet = {'nom':"marc",'age':25}
for(let cle in objet){ // Itère directement sur les clés (sous forme de chaîne)
console.log(objet[cle])
}
Structure de boucle - while
while(condition){
code de la boucle;
}
Opérateur ternaire :
condition ? valeur1 : valeur2
Fonctions
Fonctions anonymes
function(parametres){
corps de la fonction
}
Structure de fonction et syntaxe simplifiée
function nomFonction(parametres){
// Commentaires
code de la fonction;
return valeurRetour
}
// ES6 permet d'utiliser la flèche (=>) pour définir des fonctions.
function additionne(a,b){
return a+b
}
// Équivalent à
let additionne = (a,b) => a+b
// La gauche de la flèche représente les paramètres, la droite la valeur de retour
// Définition et exécution immédiate :
function additionne(a,b){
return a+b
}(1,2);
// Définition suivie d'un appel immédiat avec paramètres.
Caractéristiques des paramètres et des valeurs de retour
- Le passage de paramètres supplémentaires ou insuffisants ne provoque pas d'erreur
- Tous les arguments réels sont en fait passés à un objet paramètre
argumentsorganisé comme un tableau - Si nous essayons d'accéder à un argument réel non reçu par
arguments, la valeur par défaut estundefined - La fonction ne peut retourner qu'une seule valeur, même si plusieurs sont spécifiées. Il faut organiser manuellement un tableau ou un objet personnalisé pour retourner plusieurs valeurs
Espaces de noms et fermetures (closures)
Les concepts de variables locales, globales, cycle de vie, portée (scope) et fonctions de fermeture sont similaires à de nombreux autres langages :
On peut se référer aux concepts d'espaces de noms en Python et de fermetures en JavaScript pour mieux comprendre.
Objets intégrés
En JavaScript, tout est objet. Voici quelques objets courants :
| Objet | Description |
|---|---|
| Array | Tableaux de données |
| String | Manipulation de chaînes de caractères |
| Date | Manipulation de dates et heures |
| Math | Opérations mathématiques |
| JSON | Traitement de données JSON |
| RegExp | Expressions régulières |
| Number | Manipulation de nombres |
Voici quelques-uns de ces objets en détail :
Objet Date
- Afficher la date d'un objet Date
// D'abord convertir l'objet date en chaîne
let dateStr = objetDate.toLocaleString();
console.log(dateStr);
- Créer des objets Date
// Méthode 1 : sans paramètre
let d1 = new Date();
console.log(d1.toLocaleString());
// Méthode 2 : paramètre chaîne de date
let d2 = new Date("2023/05/15 14:30");
console.log(d2.toLocaleString());
// Méthode 3 : paramètre millisecondes
let d3 = new Date(5000);
console.log(d3.toLocaleString());
// Méthode 4 : paramètres année, mois, jour, heure, minute, seconde, milliseconde
let d4 = new Date(2023,4,15,14,30,0,300);
console.log(d4.toLocaleString());
- Méthodes de l'objet Date
| Méthode | Description |
|---|---|
| getDay() | Renvoie le jour de la semaine (0-6) |
| getDate() | Renvoie le jour du mois (1-31) |
| getMonth() | Renvoie le mois (0-11) |
| getFullYear() | Renvoie l'année complète |
| getHours() | Renvoie les heures (0-23) |
| getMinutes() | Renvoie les minutes (0-59) |
| getSeconds() | Renvoie les secondes (0-59) |
| getMilliseconds() | Renvoie les millisecondes (0-999) |
| getTime() | Renvoie le nombre de millisecondes depuis le 1er janvier 1970 |
Objet JSON
- Convertir un objet JavaScript en chaîne JSON :
let str = JSON.stringify(objet) - Analyser une chaîne JSON en objet JavaScript :
let obj = JSON.parse(str)
Objet RegExp
// Deux manières de définir des expressions régulières
let regex1 = new RegExp("^[a-zA-Z][a-zA-Z0-9]{5,11}$");
let regex2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/;
// Validation avec une expression régulière
regex1.test('utilisateur123')
regex2.test('utilisateur123')
/*Attention : les expressions régulières ne peuvent pas contenir d'espaces*/
// Correspondance globale
let texte = 'marc dupont marc marc';
texte.match(/marc/)
texte.match(/marc/g)
let regex2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/g
regex2.test('marc');
regex2.test('marc');
regex2.lastIndex;
/*Attention : en correspondance globale, il y a une propriété lastIndex*/
// Validation sans paramètre
let regex2 = /^[a-zA-Z][a-zA-Z0-9]{5,9}$/
regex2.test();
regex2.test(undefined);
let regex3 = /undefined/;
regex3.test();
Problème avec la correspondance globale
Comme dans l'exemple ci-dessus, le test donne une fois true, une fois false, car la propriété lastIndex fonctionne comme un curseur. La première correspondance atteint la fin de la chaîne, et la deuxième ne trouve plus rien.