« Programmation JavaScript/Variables » : différence entre les versions

Contenu supprimé Contenu ajouté
Touffy (discussion | contributions)
→‎boolean : oups, énorme faute à propos des équivalences
Touffy (discussion | contributions)
Ligne 195 :
 
===object===
Une variable de type '''object''' assume pleinement sa nature. Les autres types de variables, dits "scalaires", se comportent comme s'ils étaient eux-mêmes une valeur. Ainsi, lorsqu'on passe une variable scalaire à une expression, sa valeur est clonée. En revanche, passer une variable de type '''object''' ne fait que copier la référence, et la valeur n'est pas clonée.
Une variable de type objet est l'instance d'un objet. L'instanciation s'effectue avec le mot réservé new.
 
L'existence de "classes" en JavaScript est discutée. Le langage ne possède pas de déclaration de classe en tant que telle. Pour cette raison, l'utilisation de ce terme sera mise entre guillemets.
 
Il existe trois manières de créer une variable de type '''object'''.
* implicitement par l'expression littérale d'une valeur non-scalaire (valable uniquement quand une expression littérale existe pour la "classe" voulue)
* explicitement avec '''new''' et le constructeur (valable pour toutes les "classes" sauf les objet du DOM)
* indirectement pour les objets du DOM (et on ne peut pas utiliser '''new''' avec eux)
 
L'instanciation explicite d'un objet grâce à un constructeur s'effectue avec l'opérateur '''new'''.
<pre>
t = new Array();
alert(typeof t) // Affiche "object"
</pre>
 
Les expressions littérales de chaînes, nombres et booléens créent des variables scalaires alors que le constructeur de ces types crée un objet (explicitement de type '''object''' et donc strictement différents d'une valeur scalaire équivalente). Mais les expressions littérales de fonctions, tableaux et expressions rationnelles créent des objets, car ce ne sont pas des types scalaires. Ces objets, instanciés sans utilisation de '''new''', sont néanmoins strictement identiques à leur équivalent produit par l'appel d'un constructeur. Par exemple :
 
<pre>
// valeur scalaire vs. objet
"chaîne" !== new String("chaîne")
2.34 !== new Number(2.34)
 
// objet vs. objet... c'est pareil !
["a", "b", "c"] === new Array("a", "b", "c")
/(\w+) ?\(/i === new RegExp("(\w+) ?\(", "i")
</pre>
 
On peut créer un objet générique (qui sera simplement une instance de la "classe" '''Object''') avec la notation littérale. Cela consiste à écrire, entre accolades, une liste de couples clé : valeur séparés par des virgules, la clé pouvant être un identifiant ou bien une chaîne, et la valeur pouvant être n'importe quelle valeur. La clé et la valeur sont séparés par deux points (':').
 
<pre>
objetLitteral = {
nom : "Mac OS X",
version : 10.5,
"nom de code" : "Leopard"
}
</pre>
Attention, dans l'exemple ci-dessus, on ne pourra accéder à la dernière propriété ("nom de code") de l'objet qu'avec la notation tableau (avec des crochets), pas la notation objet (avec des points) car ce n'est pas un identifiant valide (il y a des espaces dedans).
 
Le DOM (aussi bien W3C que IE) définit certaines "classes" : HTMLElement, HTMLTextNode, HTMLDocument, CSSRuleSet, CSSRule, etc. On doit utiliser les méthodes du DOM (comme document.createElement()) pour instancier ces objets (le "DOM 0" fait exception à cette règle et à bien d'autres).
 
Les autres "classes" d'objets ne peuvent être créés que par un constructeur. Il y a des constructeurs natifs tels que '''Date''', et on peut définir un constructeur soi-même. Pour plus de détails, voir le chapitre consacré aux objets.
 
===function===