Premiers pas en JavaScript
17.4 opérateurs inconnus jusqu'ici
cuy copyleft
  See You Why?  

 


opérateurs : ordre de précédence - récapitulatif (17.3) | | exercices relatifs aux conditions complexes (17.8)

Contenu

 

 

I. Condition complexe

voir <<< séquence précédente

 

II. Ordre de priorité ou de précédence

voir <<< séquence précédente

 

III. Récapitulatif de l'ordre de priorité ou de précédence

voir <<< séquence précédente

 

IV. Opérateurs inconnus jusqu'ici

Notre but ne sera rien d'autre que de vous initier rapidement à chacun des opérateurs que nous n'avons pas encore rencontrés jusqu'ici, soit pour que vous ne soyez pas désarçonnés au cas où vous en croiseriez un, soit pour vous renvoyez à d'autres séquences ou chapitres qui en feront mieux état.

 

 
 

A. Membres

Pour plus d'informations, nous renvoyons le lecteur aux chapitres relatifs aux objets (chap. 23 et suivants).

Deux opérateurs sont considérés dans ce point de chapitre, le point (.) et les crochets ([]). Nous y découvrirons qu'il existe une hiérarchie entre les objets et que nous pourrons écrire :
window.document.forms["formul2"].champ_text.value
qui se lira :
"la valeur du texte associé au champ de texte nommé « champ_text »
dans le formulaire nommé « formul2 »)
de la page web en cours « document », à savoir ici « jvs_174_oper_inconnus.html »
de la fenêtre active « window »
"

Les bons Belges reconnaitront ici le sens du néerlandais "VAN DE"...

La notation point . qui sépare chaque objet indique bien son appartenance à l'objet qui le précède, comme s'il en était un membre ou une propriété propre, voire même une méthode (disons, pour l'instant, une fonction propre)... certains vont jusqu'à parler de classe, mais nous expliquerons plus loin pourquoi cette dénomination nous semble impropre.

Lorsque nous parlerons d'objets particuliers, appelés tableaux, nous utiliserons aussi souvent la notation crochets [],
tantôt pour créer un objet : var pays_ce=[Allemagne,Berlin,81471834,357026,DE],
tantôt pour désigner un de ces éléments par un indice chiffré : document.write(pays_ce[0]);
tantôt encore pour lui attribuer une propriété : pays_ce["capitale"] = "Berlin";

Rendez-vous pour la suite au chapitre 26, relatif aux tableaux.

 


 

B. new

Pour plus d'informations, nous renvoyons encore le lecteur aux chapitres relatifs aux objets (chap. 23 et suivants).

Nous y verrons que l'opérateur new remplira différentes fonctions :

 

 
 

C. appel de fonction ()

Un des rôles des parenthèses est d'appeler une fonction pour l'exécuter. Attention, ces parenthèses doivent être collées au nom de la fonction qui les précède, sans espace. Écrire maFonction(arguments) c'est appeler une fonction soit prédéfinie, soit définie par ailleurs ; c'est donc exécuter la liste d'instructions définies dans le corps (nous l'avons appelé la définition de la fonction, voir ici).

L'opérateur () peut aussi avoir d'autres rôles :

Rappelons ici que l'opérateur (), considéré comme appel de fonction, aura deux opérandes :
* une première obligatoire à placer juste avant les parenthèses : le nom de la fonction, ici maFonction;
* une deuxième facultatif à placer entre les parenthèses : une liste de un ou plusieurs arguments, séparés par des virgules.

 

D. les opérateurs binaires

Plusieurs tutoriels se contententent d'opposer les opérateurs binaires aux opérateurs unaires ou tertiaires, ne tenant compte que du nombre d'opérande(s). Il s'agit là d'un raccourci un peu enfantin, puisqu'il faut comprendre que l'algèbre binaire opère en base 2 ou binaire, comme nous opérons généralement en base 10 ou décimale.

Commençons par développer cette approche enfantine :

Une approche plus correcte consiste à dire que les opérateurs binaires traitent leurs opérandes comme des séquences de 32 bits (zéros et uns, les deux seuls chiffres du binaire), plutôt que comme des nombres décimaux, hexadécimaux ou octaux.
Par exemple, le nombre décimal 11 (onze) a une représentation binaire de 1011.
Les opérateurs binaires traitent de telles représentations binaires.

Avant de poursuivre, nous voulons informer nos lecteurs que la maitrise des opérateurs binaires ne nous parait pas du tout fondamentale pour la bonne utilisation du JavaScript... elle le serait peut-être un peu plus pour d'autres langages. À bon entendeur...
Nous aborderons ici :
* la numérotation en base deux ou système binaire ;
* les entiers 32 bits signés ;
* les opérateurs binaires bit à bit ;
* les opérateurs binaires sur opérandes.

 

1. Numérotation en base deux ou système binaire

Rappelons ici l'essentiel du système binaire ou système en base deux (abordé dans notre tutoriel HTML pour déterminer les couleurs).


 

Pour la suite retenons que d142 (142 en décimal) s'écrit 10001110 sur 8 bits ou 0000000010001110 sur 16 bits... nous ne présenterons pas la version 32 bits pour le simple plaisir d'avoir des zéros en plus.

 

2. Entiers 32 bits signés

Le lecteur un peu attentif aura réagi en mettant en évidence que la description du système binaire faite ci-dessus ne peut générer que des nombres entiers positifs d'une valeur maximale de 4 294 967 296... et quid des entiers négatifs alors ? et quid des valeurs décimales (avec virgules) ? Notre but n'est pas ici de développer toutes les tentatives qui ont été faites pour l'encodage des nombres, mais nous voudrions bien survoler quelques difficultés rencontrées avant de poursuivre notre algèbre, notre logique et nos opérateurs binaires.

Une solution rapidement envisagée était de consacrer un bit pour le signe et de stocker la valeur sur les 31 bits restants. Cette solution fut vite abandonnée, car elle ne permettait pas d'additionner correctement et rapidement des valeurs de signe contraire.

Les informaticiens ont préféré utiliser ce qu'on appelle le complément à 1 ou appliquer l'opérateur binaire NON (~) qui consiste à inverser l'ensemble des bits de l'opérande, auquel on ajoute un pour avoir le complément à deux qui sera le négatif du nombre de départ :

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
complément à un : ~142 1111111101110001
complément à deux : -142 1111111101110010

Observons :

Ces quelques explications vont vous permettre de partager vos connaissances en informatique en société... vous pourrez dire "Les opérandes de tous les opérateurs binaires sont convertis en entiers 32-bits signés en ordre big-endian et en format de complément à deux" et d'expliquer si on vous le demande ;o)

 

 

3. Les opérateurs binaires bit à bit

Nous distinguerons les opérations bit à bit avant d'aborder les opérateurs qui agissent sur un ou plusieurs octets.

Table de vérité de AND (=ET) noté &
bit1 bit2 bit1&bit2
1 1 1
0 1 0
1 0 0
0 0 0
Table de vérité de OR (=OU incl) noté |
bit1 bit2 bit1 | bit2
1 1 1
0 1 1
1 0 1
0 0 0
Table de vérité de XOR (=OU excl) noté ^
bit1 bit2 bit1^bit2
1 1 0
0 1 1
1 0 1
0 0 0
Table de vérité de NOT (=NON) noté ~
bit1   ~bit1
0   1
1   0

 

 

4. Les opérateurs binaires sur opérandes

Dès l'instant où les opérations sur bit sont assimilées, le lecteur n'aura aucune difficulté à comprendre la logique binaire sur opérandes (à 32 bits en JS). En effet, les opérateurs logiques binaires fonctionnent de la manière suivante :

* Les opérandes sont convertis en entiers 32 bits et sont exprimés sous la forme d'une série de bits (zéros et uns).
* Chaque bit du premier opérande est combiné avec le bit correspondant du second opérande :
    le premier bit avec le premier bit, le second bit avec le second bit, et ainsi de suite.
* L'opérateur est appliqué à chaque paire de bits, et le résultat est construit bit après bit.

Opérateur Utilisation Description
ET binaire a & b Renvoie un 1 pour chaque position de bit pour laquelle les bits correspondants des deux opérandes sont des 1.
OU inclusif binaire a | b Renvoie un 1 pour chaque position de bit pour laquelle le bit correspondant d'au moins un des deux opérandes est un 1.
OU exclusif binaire (XOR) a ^ b Renvoie un 1 pour chaque position de bit pour laquelle le bit correspondant d'un seul des deux opérandes est un 1.
NON binaire ~ a Inverse les bits de son opérande.
Décalage ŕ gauche a << b Décale a en représentation binaire de b bits vers la gauche, en introduisant des zéros par la droite.
Décalage ŕ droite avec propagation du signe a >> b Décale a en représentation binaire de b bits vers la droite, en introduisant le bit de signe ŕ gauche.
Décalage ŕ droite non signé avec introduction de zéros a >>> b Décale a en représentation binaire de b bits vers la droite, en rejetant les bits ŕ droite et en introduisant des zéros par la gauche.

 

a. opérateur & (and)

on constatera que 142&9 = 8

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
9 0000000000001001
142&9 = 8 0000000000001000

 

 

b. opérateur | (or)

on constatera que 142|9 = 143

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
9 0000000000001001
142|9 = 143 0000000010001111

 

 

c. opérateur ^ (xor)

on constatera que 142^9 = 135

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
9 0000000000001001
142^9 = 135 0000000010000111

 

 

d. opérateur not ~

Utiliser le NON binaire avec n'importe quel nombre x positif donne -(x + 1)

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
complément à un : ~142 = -143 1111111101110001

 

 

e. opérateur décalage à droite >>

Utiliser a>>b revient à diviser par 2b sans tenir compte des décimales, en effet 142/8 = 17,... car 142>> 71>> 35>> 17 (soit d16+d1) :

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
142>>3 = 17 0000000000010001

 

 

f. opérateur décalage à gauche <<

Utiliser a<<b revient à multiplier par 2b. On constate en effet que 142*4 = 568, car 142<< 284<< 568

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
142<<2 = 568 0000001000111000

 

 

g. opérateur décalage à droite non signé >>>

Avec un nombre positif, >>> agit comme >>,

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
142>>>3 = 17 0000000000010001

Avec un nombre négatif, non

valeur décimale valeur binaire sur 16 bits
142 0000000010001110
~142 = -143 1111111101110001
-143>>>3 = 8174 0001111111101110

 

 

E. l'opérateur , (virgule)

L'opérateur virgule ',' est le dernier dans l'ordre de précédence et est malheureusement rarement documenté valablement.

Mozilla nous donne l'explication suivante : "L'opérateur virgule (,) évalue simplement ses deux opérandes et renvoie la valeur de la deuxième. Cet opérateur est employé principalement à l'intérieur des boucles for, pour pouvoir mettre à jour plusieurs variables à chaque itération de la boucle. À titre d'exemple, si a est un tableau à 2 dimensions avec 10 éléments par côté, le code suivant utilise l'opérateur virgule pour incrémenter deux variables à la fois. Ainsi, le code peut afficher les valeurs des éléments présents sur la diagonale du tableau :"[1]

et d'llustrer son propos par :

for (var i = 0, j = 9; i <= 9; i++, j--) {
    document.writeln("a[" + i + "][" + j + "]= " + a[i][j]);
}

Microsoft se contente de ce court commentaire : "L'opérateur , entraîne l'exécution des expressions de gauche à droite. L'opérateur , est souvent utilisé dans l'expression d'incrémentation d'une boucle for. [...] L'instruction for autorise l'exécution d'une seule expression à la fin de chaque passage dans la boucle. L'opérateur , permet de traiter plusieurs expressions comme une expression simple. De cette manière, les deux variables peuvent être incrémentées."[2]

Nous invitons le lecteur à parcourir les notes de Angus Croll qui nous ont paru assez complètes, mais un peu floues : http://javascriptweblog.wordpress.com/2011/04/04/the-javascript-comma-operator/ (visitée le 15 septembre 2013).

 

 

F. l'opérateur typeof

L'opérateur "typeof" en JavaScript vous permet de sonder le type de données de son opérande, pour savoir si une variable est une chaîne, un numérique, un booléen, un objet ou encore indéfinie si elle a été déclarée mais pas affectée.


 

G. l'opérateur void

L'opérateur "void" est employé quand une instruction est exécutée mais qu'aucune valeur ne doit être renvoyée. Relativement peu connu, l'opérateur "void" permet d'exécuter une expression JavaScript pour ensuite retourner undefined.

Peu utile quand on en est à ses premiers pas en JS.

 

H. l'opérateur delete

L'opérateur "delete" peut:
* supprimer un objet,
* supprimer une propriété d'un objet ou
* supprimer un élément d'un tableau présent à un indice donné
* supprimer des variables déclarées implicitement mais pas celles déclarées avec le mot-clé var.

Attention, lorsque vous supprimez un élément d'un tableau, cet élément n'est plus dans le tableau (il devient undefined) mais la longueur du tableau n'est pas affectée...

 
 

I. l'opérateur in

L'opérateur "in" renvoie true si la propriété spécifiée se trouve dans l'objet spécifié ou si l'indice spécifié se trouve dans le tableau spécifié. Attention, "in" renverra false si vous essayez de trouver une valeur dans le tableau spécifié.

 

 

J. l'opérateur instanceof

L'opérateur "instanceof" retourne une valeur booléenne (true ou false) indiquant si un objet est une instance d'une classe particulière.

function objTest(obj){
   var i, t, s = "";
   t = new Array();
   t["Date"] = Date;
   t["Object"] = Object;
   t["Array"] = Array;
   for (i in t){
      if (obj instanceof t[i]) {
         s += obj + " est une instance de " + i + "<br>";
      } else {
         s += obj + " n est pas reconnue comme instance de " + i + "<br>";
      }
   }
   return(s);
}
var nu = new Date();
document.write(objTest(nu));
// va écrire la date du jour suivi de :
// est une instance de Date
// est une instance de Object
// n est pas reconnue comme instance de Array
 

 
 

K. l'opérateur this

L'opérateur 'this' représente l'objet en cours de manipulation dans une méthode, un constructeur d'objet ou une balise HTML. Vous en saurez plus après la lecture des chapitres 23 et suivants, relatifs aux objets.

 

 

 [1] https://developer.mozilla.org/fr/docs/JavaScript_Guide/Op%C3%A9rateurs/Op%C3%A9rateurs_sp%C3%A9ciaux

 [2] http://msdn.microsoft.com/fr-fr/library/9b37css7(v=vs.94).aspx

 

 

 

VIII. Exercices relatifs aux conditions complexes

voir suite >>>

 

 

IX. Test relatif aux conditions complexes

voir suite >>>

 

 


opérateurs : ordre de précédence - récapitulatif (17.3) | | exercices relatifs aux conditions complexes (17.8)