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 function
listes 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)
; arg2
sera 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 a
instruction 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' typeof
opé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 undefined
objet. (Et puis, lorsque vous essayez d'utiliser cet undefined
objet 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 undefined
comme 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' in
opérateur, qui n'était pas dans la version originale Netscape de JavaScript, mais est disponible partout maintenant:
if ('prop' in o)
...
En résumé, undefined
est 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, undefined
il convient d'éviter. Cela n'aurait jamais dû faire partie de la langue; null
aurait 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
, NaN
et des chaînes vides. Mais dans ce cas, oui, c'est vraiment de undefined
cela 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.property
opérateur enlève vraiment les choses.
delete
est 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.