samedi 13 novembre 2010
Après une courte pause d'analyse des attrapes JavaScript pour éviter d'en faire une indigestion (vous comprendrez que j'ai aussi été très occupé), me revoilà ce matin prêt à examiner la troisième question du test de PerfectionKills qui présente un piège avec l'instruction delete.
Voici l'énoncé :
(function(x){Choix de réponse :
delete x;
return x;
})(1);
- 1
- null
- undefined
- error
En regardant de plus près, ceci nous montre que la variable x n'est pas supprimée :
(function(x){Et que la bonne réponse sera 1 :
delete x;
console.log(typeof x); // number
return x;
})(1);
var result = (function(x){Suite à l'explication trouvée dans cet article du même site (understanding delete, lecture recommandée malgré sa longueur), on comprend qu'il est impossible de supprimer les arguments d'une fonction. Dans le cas qui nous préoccupe, nul besoin de plus amples explications pour répondre à la question. Or, dans les autres cas, l'instruction delete a un comportement particulier qu'il vaut la peine de comprendre.
delete x;
return x;
})(1);
alert(result); // 1
En règle générale, on peut supprimer une propriété d'un objet (ou un élément à un indice spécifique d'un tableau) mais pas une variable. Pour saisir toute la subtilité, notez la différence :
// variable déclaréeMais si le mécanisme d'assignation est utilisé :
var a = 1;
delete a;
alert(typeof a); // number
// assignation de propriété (à l'objet global)
b = 1;
delete b;
alert(typeof b); // undefined
var x = this;Des assignations à des variables non déclarées créent des propriétés supprimables. Autrement, les variables et les fonctions ne le sont pas.
x.test = 10;
alert(typeof x.test); // number
delete x.test;
alert(typeof x.test); // undefined