mercredi 29 décembre 2010

Le piège JavaScript avec undefined

C'est sûre que vous déjà utilisé la propriété undefined en JavaScript pour vérifier si une variable a été assignée. Soit l'exemple:

var app = new Object();
var a = '';
var b;

app.isDefined = function(value){
   return value !== undefined;
}

console.log( app.isDefined(a) ? 'defined' : 'undefined' );
console.log( app.isDefined(b) ? 'defined' : 'undefined' );

Logiquement, On s'attend à ce que la variable 'a' soit définie alors que 'b' ne le soit pas Mais qu'arriverait-t-il si on définissait volontairement une variable undefined dans ce script ou involontairement lors de l'inclusion d'une librairie externe ? Le concept de closure viendrait introduire une vulnérabilité :

var app = new Object();
var a = '';
var b;

var undefined = 4; // oups...

app.isDefined = function(value){
   return value !== undefined;
}

console.log( app.isDefined(a) ? 'defined' : 'undefined' );
console.log( app.isDefined(b) ? 'defined' : 'undefined' );

Dans ce cas-ci, les deux appels retourneraient 'defined'.

L'idéal serait de ne jamais se fier à la propriété undefined, à moins de la redéclarer à l'intérieur de la fonction qui compte l'utilise.Ainsi, on évitera les mauvaises surprises reliées à ce genre de pratique.
  
var undefined = 4; // ok
app.isDefined = function(value){
   // sans danger pour le undefined dans la portée globale
   var undefined;
   return value !== undefined;
}

Aucun commentaire:

Enregistrer un commentaire