Je suis un peu confus au sujet du JavaScript undefined
et des null
valeurs.
Que fait-il if (!testvar)
réellement? Teste-t-il pour undefined
et null
ou juste undefined
?
Une fois qu'une variable est définie, puis-je la réinitialiser undefined
(donc supprimer la variable)?
Puis-je passer undefined
en paramètre? Par exemple:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
javascript
undefined
UN J.
la source
la source
Réponses:
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érentnull
. 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 surundefined
. Vous pouvez tester cela avec par exemple:Avec cette méthode, vous ne pouvez pas faire la différence entre
dosomething(1)
etdosomething(1, undefined)
;arg2
sera la même valeur dans les deux. Si vous devez faire la différence, vous pouvez regarderarguments.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 revientundefined
. 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 casundefined
. 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 cetundefined
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:
Cependant, comme vous pouvez attribuer
undefined
comme n'importe quelle autre valeur: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: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.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 deundefined
cela qu'il s'agit. OMI, il devrait être plus explicite à ce sujet et direif (testvar!==undefined)
.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 sortirdelete 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 direvariable= null
.Oui.
la source
undefined
est un objet singleton? Que voulez-vous dire? C'est une valeur primitive et non un objet.typeof foo=='undefined'
; il a tendance à être utilisé pour (4a) le reniflement global, auquel cas je préférerais être explicite et dire'foo' in window
, ou (4b) tester par rapport à la valeurundefined
elle-même, auquel cas je préférerais être lisible et direfoo===undefined
. En théorie, les teststypeof
contre'undefined'
pourraient avoir un cas d'utilisation que d'autres constructions ne pourraient pas fournir: détecter l'existence de variables locales. Cependant, en réalité, vous savez presque toujours quelles variables sont déclarées locales.return
instruction renvoieundefined
, mais si la fonction est un constructeur (invoqué avec l'new
opérateur), elle renverra le nouvel objet (la valeur de l'this
intérieur du constructeur) malgré l'absence d'unereturn
instruction.console.log((function (){}()));
retourneundefined
.console.log((new function (){}()));
renvoie un objet.Vous ne pouvez pas (ne devriez pas?) Définir quoi que ce soit comme indéfini, car la variable ne serait plus indéfinie - vous venez de la définir en quelque chose.
Vous ne pouvez pas (ne devriez pas?) Passer
undefined
à une fonction. Si vous souhaitez transmettre une valeur vide, utiliseznull
plutôt.L'instruction
if(!testvar)
vérifie les valeurs booléennes true / false, celle-ci teste si elle esttestvar
évaluéefalse
. Par définition,null
etundefined
ne doit pas être évalué ni commetrue
nifalse
, mais JavaScript est évaluénull
commefalse
et donne une erreur si vous essayez d'évaluer une variable non définie.Pour tester correctement
undefined
ounull
utiliser ces éléments:la source
==
et!=
).var a= undefined
. Tu peux passerfn(undefined)
. Si vous souhaitez trouver la différence entre une propriété non définiep
d'un objeto
et une propriétép
définie et définie surundefined
, vous devez utiliser l''p' in o
opérateur.testvar === undefined
plutôt que le plus compliquétypeof(testvar) === "undefined"
?typeof
test pour des variables non définies: contrairement ànull
, ilundefined
s'agit simplement d'une propriété de l'objet global et peut lui-même être redéfini. Il ne prend qu'un style de codage particulier et un signe égal manquant etundefined
est modifié en silence:if (undefined = someVar) {...}
undefined
une propriété immuable de l'objet global, il est donc plus sûr qu'auparavant. Cependant, il est toujours possible de définir une variable mutable appeléeundefined
dans une fonction, de sorte que le problème ne s'est pas entièrement résolu.La différence fondamentale est que
undefined
etnull
représentent différents concepts.Si seulement
null
était disponible, vous ne seriez pas en mesure de déterminer si elle anull
été définie intentionnellement comme valeur ou si la valeur n'a pas encore été définie, sauf si vous avez utilisé une capture d'erreur lourde: par exempleCependant, si vous définissez intentionnellement la valeur sur
null
, une égalité stricte avecundefined
échoue, vous permettant ainsi de faire la différence entre les valeursnull
etundefined
:Consultez la référence ici au lieu de vous fier à des gens qui disent des ordures avec dédain comme "En résumé, undefined est un gâchis spécifique à JavaScript, ce qui déroute tout le monde". Tout simplement parce que vous êtes confus, cela ne signifie pas que c'est un gâchis.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/undefined
Ce comportement est pas spécifique à JavaScript et il complète le concept généralisé qu'un résultat booléen peut être
true
,false
inconnu (null
), aucune valeur (undefined
), ou quelque chose a mal tourné (error
).http://en.wikipedia.org/wiki/Undefined_value
la source
null
aurait toujours fonctionné très bien.a == null
esttrue
parce que la contrainte de type Javascript.La meilleure façon de vérifier une valeur nulle est
et pour indéfini
Vous pouvez attribuer une variable avec undefined.
la source
!==
, pas!=
OUI, vous pouvez, car indéfini est défini comme indéfini.
ton cas:
vous pouvez également créer votre propre variable non définie:
la source
Pour répondre à votre première question, l'opérateur not (
!
) contraindra tout ce qui lui est donné en valeur booléenne. Alorsnull
,0
,false
,NaN
et""
(chaîne vide) apparaissent tous faux.la source
undefined
n'apparaîtra pasfalse
, il générera une erreur 'n'est pas défini'.if (undefined) {/* Do stuff*/}
ne donnera pas d'erreur, carundefined
existe en tant que propriété de l'objet global. Ce qui donnera une erreur est quelque chose commeif (someUndeclaredVariable) {/* Do stuff*/}
JavaScript, comment définir une variable sur undefined en ligne de commande:
Définissez une variable sur undefined dans le
js
terminal de ligne de commande javascript fourni avec Java sur Ubuntu 12.10.Si vous définissez une variable sur undefined dans un javascript:
Mettez ceci dans myjs.html:
Il imprime ceci:
AVERTISSEMENT! Lorsque vous définissez votre variable sur undefined, vous définissez votre variable sur une autre variable. Si une personne sournoise s'exécute,
undefined = 'rm -rf /';
chaque fois que vous définissez votre variable sur undefined, vous recevrez cette valeur.Vous vous demandez peut-être comment je peux générer les extraterrestres à valeur indéfinie au début et le faire fonctionner. C'est à cause du levage javascript: http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html
la source
Essaye ça:
la source
Le for
if (something)
etif (!something)
est couramment utilisé pour vérifier si quelque chose est défini ou non. Par exemple:L'identifiant est converti en valeur booléenne, il
undefined
est donc interprété commefalse
. Il existe bien sûr d'autres valeurs (comme 0 et '') qui sont également interprétées commefalse
, mais soit l'identifiant ne devrait pas raisonnablement avoir une telle valeur, soit vous êtes satisfait de traiter une telle valeur de la même manière que non définie.Javascript a un
delete
opérateur qui peut être utilisé pour supprimer un membre d'un objet. Selon l'étendue d'une variable (c'est-à-dire si elle est globale ou non), vous pouvez la supprimer pour la rendre indéfinie.Il n'y a aucun
undefined
mot-clé que vous pouvez utiliser comme littéral non défini. Vous pouvez omettre des paramètres dans un appel de fonction pour les rendre indéfinis, mais cela ne peut être utilisé qu'en envoyant moins de paramètres à la fonction, vous ne pouvez pas omettre un paramètre au milieu.la source
Juste pour le plaisir, voici un moyen assez sûr d'affecter "non affecté" à une variable. Pour que cela ait une collision, il faudrait que quelqu'un ait ajouté au prototype d'Object avec exactement le même nom que la chaîne générée aléatoirement. Je suis sûr que le générateur de chaînes aléatoires pourrait être amélioré, mais je viens de prendre une de cette question: Générer des chaînes / caractères aléatoires en JavaScript
Cela fonctionne en créant un nouvel objet et en essayant d'accéder à une propriété sur celui-ci avec un nom généré aléatoirement, ce qui, nous supposons, n'existera pas et aura donc la valeur indéfini.
la source