Java Script
Java Script
Ecriture
Une variable peut être déclarée à l'aide du mot clef var et ne doivent pas
contenir de caractères spéciaux à l'exception des _.
var a = 2
var une_variable_plus_longue = "Ma super chaine"
Les nombres
var a = 2
var b = 3.4123
var c = -509
var d = 1/3
Il n'y a pas de réel différence entre les simples et doubles quotes sauf si
notre chaine de caractère contient des ' ou "
var a = "Ceci n'est pas poblématique"
var b = 'Ceci n\'est pas problématique'
Les booléens
Les booléens permettent de stocker une information qui sera soit vraie soit
fausse
var vrai = true
var je_suis_faux = false
Les tableaux
Les tableaux permettent de stocker une liste d'information. Cette liste peut
contenir n'importe quel autre type de variable (un tableau peut même
contenir un autre tableau).
var eleves = ['Jean', 'Marc', 'Marion']
var demo = [true, 10, 'Marc']
Les objets
Les objets permettent de stocker des informations plus complexes qu'une
simple liste. Pour le moment, vous pouvez imaginer les objets comme une
liste avec des index nommés.
var eleve = {
clef: 'valeur',
nom: 'Jean',
age: 18,
notes: [10, 4, 18]
}
Dans un objet les "clefs" sont appellés des propriétés. Pour récupérer une
valeur associée à une propriété il y a 2 notations possibles.
eleve.nom // Jean
eleve.notes // [10, 4, 18]
eleve.notes[1] // 4
// On peut aussi utiliser une notation proche de celle des tableaux
eleve['notes'] // [10, 4, 18]
Types spéciaux
Enfin, lors de votre découverte du javaascript vous allez rencontrer
certaines variables qui correspondent à certains cas spécifiques
undefined // quand on essaie d'accéder à
null //
NaN // 'not a number'
Typage faible
En javascript le typage est faible, suivant les opérations les variables
peuvent changer implicitement de type.
var a = '1'
var b = 1
a + b = '11'
// b est convertit en chaine de caractère implicitement
a * b = 1
// a est convertit en nombre de manière implicite
"Salut" * 3 // NaN, Not a number
// Attention aux opérations qui n'ont pas de sens :)
"43" > 1000 // false, 1000 est convertit en chaine implicitement et il
compare l'ordre alphabétique
Opérateur de comparaison
Parfois on souhaitera tester si une variable est bien celle attendue, ou faire
une condition plus complexes. Dans ce cas là il faudra utiliser les
opérateurs de comparaison
a == b // a égale à b
a === b // a == b et a est de même "type" que b
a >= b // a supérieur OU égal à b
a > b // a strictement supérieur à b
a <= b // a inférieur OU égal à b
a < b // a strictement inférieur à b
On pourra aussi utiliser les opérateurs booléens, qui nous permettront de
combiner plusieurs conditions ensembles
// && ET
true && true // true
true && false // false
false && true // false
false && false // false
// || OU
true || true // true
true || false // true
false || true // true
false || false // false
// ! NON
!true # false
!false # true
Le switch / case
Le switch case permet d'effectuer une opération suivant la valeur que
prendra une expression.
switch (expression) {
case valeur1:
// Instructions à exécuter lorsque le résultat
// de l'expression correspond à valeur1
instructions1
break
case valeur2:
// Instructions à exécuter lorsque le résultat
// de l'expression correspond à valeur2
break
default:
// Instructions à exécuter lorsqu'aucune des valeurs
// ne correspond
break
}
C'est une notation qui est plus spécifique que les conditions avec
les if et else mais qui peut s'avérer plus simple à écrire dans certains cas
spécifiques
Le ternaire
Le ternaire, ou opérateur conditionnel est un outil qui permet de racourcir
une condition en une seul ligne
// condition ? <expression si vrai> : <expression si faux>
age = 19
"Je suis " + (age >= 18 ? "majeur" : "mineur")
Dans ce nouveau chapitre nous allons parler des boucles. Les boucles
permettent de répéter une certaine logique suivant une condition précise.
Il existe plusieurs manières de créer des boucles :
La boucle While
La boucle while permet d'exécuter un code tant que la condition passée en
paramètre n'est pas satisfaite
while (<condition>) {
// ....
}
var i = 0
while (i < 3) {
"Je compte " + i
if (i == 1) {
break
}
i++
}
La boucle For
La boucle for permet d'exécuter un code un certain nombre de fois en
précisant manuellement l'intervalle pour lequel on souhaite faire la boucle.
Elle présente une notation plus concise que le while :
var i = 0
for (var i = 0; i < 3; i++) {
"Je compte " + i
}
Cette boucle s'avèrera très utile lorsqu'il s'agira de parcourir un tableau
var eleves = ['Jean', 'Marc', 'Marie']
for (var i = 0; i < eleves.length; i++) {
eleve[i] // vaudra alternativement : Jean, Marc, Marie
}
Exemple
Si on souhaite convertir un nombre de secondes en nombre de minutes on
pourra se créer une fonction convert_to_min
var convert_to_min = function (secondes)
return secondes / 60
}
convert_to_min(3600) // 60
convert_to_min(3600) // 60
convert_to_min() // 0
Les méthodes
Une fonction peut être stockée dans la propriété d'un objet.
var eleve = {
nom: 'Marc',
note: 14,
present: function () {
return 'Je suis présent'
}
}
Une fonction utilisée sur un objet est appéllé méthode. Les méthodes sont
d'ailleurs utilisés sur les types d'objet natifs du JavaScript comme les
chaines de caractères ou les entiers.
"Salut".toUpperCase() // SALUT
"Comment ça va ?".split(' ') // ['Comment', 'ça', 'va', '?']
1.toString() // '1'
1.1312312312.toFixed(2) // '1.13'
Prototype ?
Sur la documentation vous verrez parfois le mot clef prototype. Nous ne
rentrerons pas de suite dans les détails, mais une méthode disponible sur
le prototype est une méthode disponible sur les objets du type en question
:
// fromCharCode() est disponible directement sur String
String.fromCharCode(65) // "A"
// toLowerCase() est disponible sur le prototype
// String.prototype.toLowerCase()
// La méthode s'utilise donc sur une chaine
"Salut".toLowerCase // "salut"
Nous n'allons rien apprendre de nouveau aujourd'hui mais nous allons faire
le point sur une notion importante : La portée des variables (scope en
anglais).
Les variables ont une portée limitée lorsqu'elles sont déclarées dans une
fonction :
var a = function () {
var b = 3
}
a()
b // ERREUR, b is not defined
Les fonctions ont une portée locale mais il est possible de faire appel à des
variables externes à la fonction
var exterieur = "Salut"
var maFonction = function () {
exterieur
var interieur = 3
}
maFonction() // Dans cet appel exterieur vaudra "Salut"
interieur // ERREUR, interieur is not defined
Par contre il faut faire attention car si une fonction fait appel à une variable
extérieur, elle utilisera la valeur au moment de l'éxécution d'une fonction.
C'est ce que l'on appel le contexte, le code à l'intérieur de la fonction
disposera des variables disponible lors de son éxécution.
var a = "Salut"
var maFonction = function () {
return a
}
maFonction() // "Salut"
a = "Test"
maFonction() // "Test"
Enfin il est aussi important de noter qu'un même nom de variable peut être
utilisé dans les différentes portées.
var a = "Salut" // portée globale
var maFonction = function () {
var a = "demo" // portée locale
return a
}
maFonction() // demo
a // salut
// La variable a définie dans la fonction
// n'est pas la même que la variable définie
// dans la fonction
Les blocs (for, if...) n'ont pas de portée particulière, ainsi une variable
définie dans un for ou un if est disponible en dehors de la boucle /
condition.
for (var i = 0; i < 10; i++) {
}
i // 10
L'Hoisting
Le Javascript a une manière particulière de traiter les variables. Par défaut
il déplace les déclarations de en haut du contexte courant (fonction
courante ou fichier courant)
La fonction est appellable même si elle n'est déclaré que plus tard dans le
script. L'hoisting déplace les déclarations de fonction en haut
// Le code est en fait compris de la manière suivante
// La déclaration est placée au dessus
function maFonction () {
return 3
}
// L'appel de la fonction ne pose du coup aucun souci
maFonction() // 3
C'est pour cela que l'on préférera généralement créer des fonction en
utilisant une assignation de variable afin d'éviter les problèmes qui peuvent
être causés par l'hoisting.
L'opérateur this est une sorte de super variable qui prendra différentes
valeurs suivant le contexte dans lequelle elle est utilisée.
Par défaut this prend comme valeur la variable globale (window sur le
navigateur, global sur nodejs) mais sa valeur peut changer dans une
fonction suivant comment elle est appellée.
var maFonction (a) {
return this
}
var eleve = {
maFonction: function () {
return this
}
}
maFonction() // window
eleve.maFonction() // eleve {}
maFonction.call('Salut', 'argument1') // 'Salut'
On reviendra plus tard sur cet opérateur dans des exemples plus concret.
Par exemple un objet vide (qui n'a aucune propriétés) dispose quand
même de certaines méthodes. Cet méthodes sont en fait placées dans le
prototype de l'objet.
var a = {} // L'objet est vide
a.toString() // Pourtant il a une méthode toString()
console.log(a) // Si on regarde le prototype __proto__ on trouve bien la
méthode toString()
On peut utiliser ce système pour créer des nouveau types de variables par
exemple :
// On crée l'objet qui contient les méthodes que l'on souhaite rendre
disponible sur tous nos objet de type "Eleve"
var Eleve = {
moyenne: function () {
var somme = 0
for (var i = 0; i < this.notes.length; i++) {
somme += this.notes[i]
}
return somme / this.notes.length
}
}
Object.create()
La méthode montrée plus haut n'a rien d'officiel et ne sera jamais utilisé.
Lorsque l'on souhaite créer un objet on pourra utiliser la
méthode create() sur l'objet Object. Ainsi le code écrit au dessus peut être
simplifié :
// On écriera jamais ça
var jean = {notes: [10, 12]} // On crée un eleve en utilisant un objet
jean.__proto__ = Eleve // On change le prototype
jean.moyenne() // 11, La méthode moyenne est disponible sur le prototype et
peut donc être appellée
Le constructeur
Object.create() est une méthode relativement récente pour créer des
objets. Par défaut on utilise un constructeur.
// La fonction sera utilisé pour "construire" un objet
var Eleve = function (nom) {
this.nom = nom // On ajoutera une propriété "nom"
}
Eleve.prototype.moyenne = function () {
var somme = 0
for (var i = 0; i < this.notes.length; i++) {
somme += this.notes[i]
}
return somme / this.notes.length
}
Dans ce chapitre nous allons voir comment capturer les erreurs de nos
scripts en JavaScript.
Try Catch
Parfois un code peut renvoyer une erreur (souvent appellée exception).
var o = {}
o.maMethode() // Uncaught TypeError: o.maMethode is not a function
Throw
Il est aussi possible d'utiliser ce mécanisme d'erreur pour renvoyer une
erreur si on obtient quelque chose d'inattendu.
function double(nombre) {
if (!Number.isInteger(nombre) {
throw new Error('Impossible de doubler un nombre qui ne soit pas un
entier');
}
}
La documentation
Si vous avez besoin de plus d'informations ou d'exemples rendez vous sur
la documentation
L'objet window
Sur le navigateur l'objet global est l'objet window. Cet objet contient un
ensemble de méthode et de propriétés utiles comme par
exemple window.innerWidth qui renvoie la largeur de la fenêtre.
var a = 0 // Toutes variables définies globalement sont stocké dans l'objet
window
window.a // 0
Timers
L'objet window contient aussi 2 méthodes qui seront très utiles pour créer
des timers. Ces fonctions prennent en paramètre un callback (fonction) qui
sera appellé au bout d'un certain temps (indiqué en ms)
window.setInterval(function () {
// Ce code sera appellé toutes les secondes (1000ms)C’est un call-back
}, 1000)
window.setTimeout(function () {
// Ce code sera éxécuté une fois au bout de 3 secondes (3000ms)
}, 3000)
Ces 2 fonctions renvoient un ID qui peut ensuite être utilisé pour stopper le
timer
var i = 0
var timer = window.setInterval(function () {
i++
if (i == 10) {
window.clearInterval(timer) // On utilise l'ID timer pour stopper
le timer
}
}, 1000)
Une fois que l'on obtient un élément il est possible d'obtenir différentes
informations.
element.getAttribute('attribut') // Permet de récupérer la valeur d'un
attribut
element.style // Permet de récupérer les styles associés à l'élément
element.classList // Permet de récupérer la liste des classes associées à
un élément
element.offsetHeight // Donne la hauteur réel de l'élément
Traverser le DOM
Un document HTML n'est au final qu'un arbre d'éléments HTML et texte
qu'il est possible de parcourir de différentes manières. Cet arbre est appellé
le DOM.
Modifier le DOM
On peut aussi créer et modifier des éléments gràce à différentes méthodes
element.appendChild(enfant) // ajoute un élément à un autre
element.removeChild(enfant) // supprime un enfant
element.textContent = 'Salut' // Change la valeur du noeud texte
element.innerHTML // Renvoie le contenu HTML de l'élément
parentElement.insertBefore(nouvelElement, refElement)
Jusqu'à maintenant nous avons créé des scripts qui se déroulent dès le
chargement de la page. La pluspart du temps on attendra un évènements
pour effectuer une action. Par exemple, nous allons déclencher une action
lors d'un clic sur un élément particulier. Pour faire cela on va avoir besoin
d'utiliser un écouteur d'évènement gràce à la méthode addEventListener.
Créer un écouter
element.addEventListener("Type d'évènement", callback)
// Par exemple pour détecter un clic sur un lien
element.addEventListener('click', function () {
window.alert('Vous avez cliqué sur le lien')
})
L'évènement
Le callback passé en second paramètre prend en paramètre l'évènement
(le type de la variable dépendra de l'évènement écouté).
// Par exemple pour détecter un clic sur un lien
element.addEventListener('click', function (e) {
e.preventDefault() // Annule l'évènement
e.stopPropagation() // Empèche l'évènement de remonter vers les
éléments parents
e.target // contient l'élément sur lequel on a cliqué
e.currentTarget // contient l'élément sur lequel on a greffé l'écouteur
})
This
Lorsqu'un écouteur est appellé la variable this fera systématiquement
référence à l'élément sur lequel on écoute l'évènement (équivalent à
currentTarget).
Supprimer un évènement
Il est aussi possible de supprimer un écouteur d'évènement à l'aide de la
méthode removeEventListener. Cette méthode prendra les mêmes
paramètres que la méthode addEventListener.
var next = function () {
this.classList.add('red')
this.removeEventListener('click', next)
}
element.addEventListener('click', next)