mercredi 29 décembre 2010
Vous avez fort probablement déjà utilisé la propriété undefined en JavaScript pour vérifier si une variable a été assignée ou pas ? Considérez simplement l'exemple suivant qui déclare ce genre de fonction :
var app = new Object();Logiquement, vous vous attendez à ce que la variable x soit définie alors que y ne le soit pas. Si oui, vous avez raison, c'est tout à fait le comportement attendu. 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 x = '';
var y;
app.isDefined = function(value){
return value !== undefined;
}
console.log( app.isDefined(x) ? 'defined' : 'undefined' );
console.log( app.isDefined(y) ? 'defined' : 'undefined' );
var app = new Object();Dans ce cas-ci, les deux appels retourneraient 'defined'.
var x = '';
var y;
var undefined = 18; // oups...
app.isDefined = function(value){
return value !== undefined;
}
console.log( app.isDefined(x) ? 'defined' : 'undefined' );
console.log( app.isDefined(y) ? 'defined' : 'undefined' );
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'utiliser :
var undefined = 18; // okAinsi, on évitera les mauvaises surprises reliées à ce genre de pratique.
app.isDefined = function(value){
// sans danger pour le undefined dans la portée globale
var undefined;
return value !== undefined;
}
Je préfère utiliser
var test
if (typeof test =='undefined')
{
/// pas défini
}