Les valeurs undefined
et null
de JavaScript me semblent un peu confuses.
Que fait réellement if (!testvar)
? Est-ce qu'il teste undefined
et null
ou simplement undefined
?
Une fois qu'une variable est définie, puis-je la remettre à undefined
(donc supprimer la variable)?
Puis-je passer undefined
en tant que paramètre? Par exemple.:
function test(var1, var2, var3) {
}
test("value1", undefined, "value2");
Je suis un peu confus à propos de Javascript non défini & null.
Ne soyez pas confus à propos de null
. Il est généralement logique et se comporte de la même manière que les concepts d’autres langages de script pour les objets "null", "nil" ou "Aucun" hors bande.
undefined
, d'autre part, est une bizarrerie JavaScript étrange. C'est un objet singleton qui représente des valeurs hors bande, essentiellement un second null
, similaire mais différent. Il se présente:
Lorsque vous appelez une fonction avec moins d'arguments que la liste d'arguments dans les listes d'instructions function
, les arguments non passés sont définis sur undefined
. Vous pouvez tester pour 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
aura la même valeur dans les deux cas. Si vous avez besoin de faire la différence, vous pouvez regarder arguments.length
, mais faire des arguments optionnels comme celui-là n'est généralement pas très lisible.
Lorsqu'une fonction n'a pas de return value;
, elle retourne 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 instruction var a
dans un bloc, mais que vous ne lui avez pas encore attribué de valeur, il s’agit de undefined
. Encore une fois, vous ne devriez jamais vraiment avoir besoin de vous fier à cela.
L'opérateur spooky typeof
retourne 'undefined'
lorsque son opérande est une simple variable inexistante, au lieu de générer 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 beaucoup d'utilisation pour cela non plus.
C'est le 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 objet undefined
. (Et ensuite, lorsque vous essayez d'utiliser cet objet undefined
plus tard dans le script, il se produira une erreur étrange beaucoup plus difficile à détecter que si JavaScript venait de générer une erreur.)
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, étant donné que vous pouvez affecter undefined
comme toute 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'opérateur in
, qui ne figurait pas dans la version originale de JavaScript de Netscape, mais qui est disponible partout à l'heure actuelle:
if ('prop' in o)
...
En résumé, undefined
est un désordre spécifique à JavaScript, qui confond tout le monde. En dehors des arguments de fonction optionnels, pour lesquels JS ne dispose d'aucun autre mécanisme plus élégant, il convient d'éviter undefined
. Cela n'aurait jamais dû faire partie de la langue. null
aurait bien fonctionné pour (2) et (3), et (4) est un défaut qui n'existe que parce qu'au début, JavaScript n'avait aucune exception.
que fait réellement
if (!testvar)
? Est-ce qu'il teste undefined et null ou juste undefined?
Un tel test de "véracité" vérifie contre false
, undefined
, null
, 0
, NaN
et les chaînes vides. Mais dans ce cas, oui, il s’agit bien de undefined
. OMI, il devrait être plus explicite à ce sujet et dire if (testvar!==undefined)
.
une fois qu'une variable est définie, puis-je la ramener à undefined (donc supprimer la variable).
Vous pouvez certainement lui affecter undefined
, mais cela ne supprimera pas la variable. Seul l'opérateur delete object.property
supprime réellement les choses.
delete
est vraiment destiné aux propriétés plutôt qu'aux variables en tant que telles. Les navigateurs vous laisseront vous débrouiller avec delete variable
direct, mais ce n'est pas une bonne idée et cela ne fonctionnera pas dans le mode strict d'ECMAScript Fifth Edition. Si vous voulez libérer une référence à quelque chose pour le ramasser, il serait plus habituel de dire variable= null
.
puis-je passer indéfini en tant que paramètre?
Oui.
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 défini quelque chose.
Vous ne pouvez pas (ne devriez pas?) Passer undefined
à une fonction. Si vous souhaitez passer une valeur vide, utilisez plutôt null
.
L'instruction if(!testvar)
vérifie les valeurs booléennes true/false. Celle-ci vérifie si testvar
est évalué à false
. Par définition, null
et undefined
ne devraient pas être évalués ni comme true
ni false
, mais JavaScript évalue null
comme false
et donne une erreur si vous essayez d'évaluer une variable non définie.
Pour tester correctement undefined
ou null
, utilisez ce qui suit:
if(typeof(testvar) === "undefined") { ... }
if(testvar === null) { ... }
La différence fondamentale est que undefined
et null
représentent des concepts différents.
Si seulement null
était disponible, vous ne pourriez pas déterminer si null
a été défini volontairement comme valeur ou si la valeur n'a pas encore été définie, à moins que vous n'ayez utilisé une capture d'erreur encombrante: par exemple
var a;
a == null; // This is true
a == undefined; // This is true;
a === undefined; // This is true;
Toutefois, si vous définissez intentionnellement la valeur sur null
, une égalité stricte avec undefined
échoue, vous permettant ainsi de différencier les valeurs null
et undefined
:
var b = null;
b == null; // This is true
b == undefined; // This is true;
b === undefined; // This is false;
Vérifiez la référence ici au lieu de vous fier à ce que des gens disent de façon nonchalante et indésirable des ordures telles que "En résumé, indéfini est un désordre spécifique à JavaScript, qui confond tout le monde". Juste 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 n'est pas non plus spécifique à JavaScript et complète le concept généralisé selon lequel un résultat booléen peut être true
, false
, unknown (null
), aucune valeur (undefined
) , ou quelque chose s'est mal passé (error
).
La meilleure façon de vérifier une valeur nulle est
if ( testVar !== null )
{
// do action here
}
et pour indéfini
if ( testVar !== undefined )
{
// do action here
}
Vous pouvez assigner une variable avec undefined.
testVar = undefined;
//typeof(testVar) will be equal to undefined.
OUI, vous pouvez, car indéfini est défini comme indéfini.
console.log(
/*global.*/undefined === window['undefined'] &&
/*global.*/undefined === (function(){})() &&
window['undefined'] === (function(){})()
) //true
ton cas:
test("value1", undefined, "value2")
vous pouvez aussi créer votre propre variable non définie:
Object.defineProperty(this, 'u', {value : undefined});
console.log(u); //undefined
Pour répondre à votre première question, l'opérateur not (!
) va forcer quoi que ce soit qui lui est donné dans une valeur booléenne. Ainsi, null
, 0
, false
, NaN
et ""
(chaîne vide) apparaîtront tous comme faux.
Définissez une variable sur non défini dans le terminal de ligne de commande javascript js
fourni avec Java sur Ubuntu 12.10.
el@defiant ~ $ js
js> typeof boo
"undefined"
js> boo
typein:2: ReferenceError: boo is not defined
js> boo=5
5
js> typeof boo
"number"
js> delete(boo)
true
js> typeof boo
"undefined"
js> boo
typein:7: ReferenceError: boo is not defined
Mettez ceci dans myjs.html:
<html>
<body>
<script type="text/JavaScript">
document.write("aliens: " + aliens);
document.write("typeof aliens: " + (typeof aliens));
var aliens = "scramble the nimitz";
document.write("found some aliens: " + (typeof aliens));
document.write("not sayings its aliens but... " + aliens);
aliens = undefined;
document.write("aliens deleted");
document.write("typeof aliens: " + (typeof aliens));
document.write("you sure they are gone? " + aliens);
</script>
</body>
</html>
Il imprime ceci:
aliens: undefined
typeof aliens: undefined
found some aliens: string
not sayings its aliens but... scramble the nimitz
aliens deleted
typeof aliens: undefined
you sure they are gone? undefined
ATTENTION! Lorsque vous définissez votre variable sur non définie, vous définissez votre variable sur une autre variable. Si une personne sournoise exécute undefined = 'rm -rf /';
alors chaque fois que vous définissez votre variable sur non définie, vous recevrez cette valeur.
Vous vous demandez peut-être comment je peux sortir les extraterrestres de valeur indéfinie au début et le faire continuer. C'est à cause de javascript hissage: http://www.équentementgood.com/JavaScript-Scoping-and-Hoisting.html
Essaye ça:
// found on UglifyJS
variable = void 0;
Juste pour le plaisir, voici un moyen relativement sûr d’affecter "non affecté" à une variable. Pour que cela ait une collision, il faudrait que quelqu'un ait ajouté au prototype pour 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 d'en 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é dessus avec un nom généré aléatoirement, ce qui, nous le supposons, n’existera pas et aura donc la valeur indéfinie.
function GenerateRandomString() {
var text = "";
var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
for (var i = 0; i < 50; i++)
text += possible.charAt(Math.floor(Math.random() * possible.length));
return text;
}
var myVar = {}[GenerateRandomString()];
Les fonctions for if (something)
et if (!something)
sont généralement utilisées pour vérifier si quelque chose est défini ou non. Par exemple:
if (document.getElementById)
L'identifiant est converti en une valeur booléenne, ainsi undefined
est interprété comme false
. Il existe bien sûr d'autres valeurs (telles que 0 et '') qui sont également interprétées comme false
, mais l'identificateur ne doit pas raisonnablement avoir une telle valeur ou vous souhaitez que cette valeur soit traitée de la même manière que non définie.
Javascript possède un opérateur delete
qui peut être utilisé pour supprimer un membre d'un objet. En fonction de la portée d’une variable (c’est-à-dire si elle est globale ou non), vous pouvez la supprimer pour la rendre non définie.
Vous ne pouvez pas utiliser de mot clé undefined
comme littéral indéfini. Vous pouvez omettre des paramètres dans un appel de fonction pour les rendre non dé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.