typage javascript
Une petite entrée qui n'a de rapport avec les maths que par la logique employée par javascript pour évaluer ses types (logique un peu plus que binaire par l'emploi de 'undefined').
Si une variable u n'est pas déclarée, l'instruction Print(typeof(u)) imprime 'undefined' et l'instruction Print(u) génère une erreur de type ReferenceError.
Si on dispose d'une série d'objets connus :
function constrClass(att){
this.attribut = att;
return this;}
constrClass.prototype = new Object;
constrClass.prototype.constructor = constrClass;
constrClass.prototype.myMethod = function(){
return this.attribut;};
var myObject = new constrClass(1);
,ces différentes déclarations produisent les impressions suivantes :
Ceci étant, la logique de javascript présente certains résultats à connaître :
Pour que la logique d'un script coïncide avec le bon sens (un OU n'est false que quand aucune de ses expressions n'est true; un ET est false dès qu'une de ses expressions est false), il faut, lors de la conception de l'expression logique, s'imposer de placer l'expression indéfinie en dernier.
Si une variable u n'est pas déclarée, l'instruction Print(typeof(u)) imprime 'undefined' et l'instruction Print(u) génère une erreur de type ReferenceError.
Si on dispose d'une série d'objets connus :
function constrClass(att){
this.attribut = att;
return this;}
constrClass.prototype = new Object;
constrClass.prototype.constructor = constrClass;
constrClass.prototype.myMethod = function(){
return this.attribut;};
var myObject = new constrClass(1);
,ces différentes déclarations produisent les impressions suivantes :
Print(typeof(u)) | Print(u) | ||||
---|---|---|---|---|---|
var u; | undefined | undefined | |||
var u=constrClass; | function |
| |||
var u=constrClass(); | object | [object global] | |||
var u=myObject.myMethod; | function |
| |||
var u=myObject.myMethod(); | number | 1 | |||
var u=myObject; | object | [object Object] |
Ceci étant, la logique de javascript présente certains résultats à connaître :
var u | var v | Print(expression logique) -> impression | Commentaire |
---|---|---|---|
; | ; | Print(u==v) -> true | 'undefined' est suffisamment défini pour pouvoir produire des expressions logiques |
; | ; | Print(u||v) -> undefined | 'undefined' est suffisamment défini pour être manipulé comme une expression binaire |
=true; | ; | Print(u||v) -> true | |
; | =true; | Print(u||v) -> true | l'effet d''undefined' est nul dans un OU face à 'true' |
=false; | ; | Print(u||v) -> undefined | l'effet d''undefined' semble prépondérant dans un OU face à un 'false'... |
; | =false; | Print(u||v) -> false | ...mais, ici, l'ordre d'évaluation intervient ! |
; | ; | Print(u&&v) -> undefined | |
=true; | ; | Print(u&&v) -> undefined | |
; | =true; | Print(u&&v) -> undefined | l'effet d''undefined' est prépondérant dans un ET face à 'true' |
=false; | ; | Print(u&&v) -> false | l'effet d''undefined' semble nul dans un ET face à un 'false'... |
; | =false; | Print(u&&v) -> undefined | ...mais, ici, l'ordre d'évaluation intervient ! |
Pour que la logique d'un script coïncide avec le bon sens (un OU n'est false que quand aucune de ses expressions n'est true; un ET est false dès qu'une de ses expressions est false), il faut, lors de la conception de l'expression logique, s'imposer de placer l'expression indéfinie en dernier.