Je suis un peu confus au sujet de Javascript non défini et nul.
Ne soyez pas confus null. Il a généralement un sens et se comporte de manière similaire aux concepts des autres langages de script des objets hors bande «null», «nil» ou «None».
undefined, d'autre part, est une bizarrerie JavaScript étrange. C'est un objet singleton qui représente des valeurs hors bande, essentiellement un deuxième similaire mais différent null. Cela revient:
Lorsque vous appelez une fonction avec moins d'arguments que la liste d'arguments dans les functionlistes d'instructions, les arguments non passés sont définis sur undefined. Vous pouvez tester cela avec par exemple:
function dosomething(arg1, arg2) {
if (arg2===undefined)
arg2= DEFAULT_VALUE_FOR_ARG2;
...
}
Avec cette méthode, vous ne pouvez pas faire la différence entre dosomething(1)et dosomething(1, undefined); arg2sera la même valeur dans les deux. Si vous devez faire la différence, vous pouvez regarder arguments.length, mais faire des arguments facultatifs comme celui-ci n'est généralement pas très lisible.
Lorsqu'une fonction n'a pas return value;, elle revient undefined. Il n'est généralement pas nécessaire d'utiliser un tel résultat de retour.
Lorsque vous déclarez une variable en ayant une var ainstruction dans un bloc, mais que vous ne lui avez pas encore attribué de valeur, c'est le cas undefined. Encore une fois, vous ne devriez pas vraiment avoir besoin de vous y fier.
L' typeofopérateur effrayant retourne 'undefined'lorsque son opérande est une simple variable qui n'existe pas, au lieu de lancer une erreur comme cela se produirait normalement si vous tentiez de vous y référer. (Vous pouvez également lui donner une simple variable entourée de parenthèses, mais pas une expression complète impliquant une variable inexistante.) Pas très utile non plus.
C'est le sujet controversé. Lorsque vous accédez à une propriété d'un objet qui n'existe pas, vous n'obtenez pas immédiatement une erreur comme dans toutes les autres langues. Au lieu de cela, vous obtenez un undefinedobjet. (Et puis, lorsque vous essayez d'utiliser cet undefinedobjet plus tard dans le script, il se passera de manière étrange, ce qui est beaucoup plus difficile à retrouver que si JavaScript venait de lancer une erreur tout de suite.)
Ceci est souvent utilisé pour vérifier l'existence de propriétés:
if (o.prop!==undefined) // or often as truthiness test, if (o.prop)
...do something...
Cependant, comme vous pouvez attribuer undefinedcomme n'importe quelle autre valeur:
o.prop= undefined;
cela ne détecte pas réellement si la propriété est là de manière fiable. Mieux vaut utiliser l' inopérateur, qui n'était pas dans la version originale Netscape de JavaScript, mais est disponible partout maintenant:
if ('prop' in o)
...
En résumé, undefinedest un gâchis spécifique à JavaScript, qui déroute tout le monde. En dehors des arguments de fonction facultatifs, où JS n'a pas d'autre mécanisme plus élégant, undefinedil convient d'éviter. Cela n'aurait jamais dû faire partie de la langue; nullaurait très bien fonctionné pour (2) et (3), et (4) est une erreur qui n'existe que parce qu'au début JavaScript n'avait pas d'exceptions.
que fait-il if (!testvar)réellement? Teste-t-il pour indéfini et nul ou simplement indéfini?
Un tel test vérifie « truthiness » contre false, undefined, null, 0, NaNet des chaînes vides. Mais dans ce cas, oui, c'est vraiment de undefinedcela qu'il s'agit. OMI, il devrait être plus explicite à ce sujet et dire if (testvar!==undefined).
une fois qu'une variable est définie, puis-je la réinitialiser à undefined (donc supprimer la variable).
Vous pouvez certainement lui attribuer undefined, mais cela ne supprimera pas la variable. Seul l' delete object.propertyopérateur enlève vraiment les choses.
deleteest vraiment destiné aux propriétés plutôt qu'aux variables en tant que telles. Les navigateurs vous permettront de vous en sortir delete variable, mais ce n'est pas une bonne idée et ne fonctionnera pas en mode strict d'ECMAScript Fifth Edition. Si vous souhaitez libérer une référence à quelque chose afin qu'il puisse être récupéré, il serait plus habituel de le dire variable= null.
puis-je passer indéfini comme paramètre?
Oui.