Quelle est la meilleure façon de vérifier si une propriété de l'objet en JavaScript n'est pas défini?
Désolé, j'ai d'abord dit variable plutôt que la propriété de l'objet. Je crois que le même == undefined
approche ne fonctionne pas.
Quelle est la meilleure façon de vérifier si une propriété de l'objet en JavaScript n'est pas défini?
Désolé, j'ai d'abord dit variable plutôt que la propriété de l'objet. Je crois que le même == undefined
approche ne fonctionne pas.
Je crois qu'il y a un certain nombre de réponses incorrectes à ce sujet. Contrairement à la croyance commune "undefined" n'est PAS un mot-clé en javascript, et peut en fait avoir une valeur qui lui est assignée.
// Degenerate code. DO NOT USE.
var undefined = false; // Shockingly, this is completely legal!
if(myVar === undefined) {
alert("You have been misled. Run away!");
}
En outre, myVar === undefined
déclenchera une erreur dans la situation où myVar est non déclaré.
Le plus robuste pour effectuer ce test est:
if(typeof myVar === "undefined")
Ce sera toujours le bon résultat, et même les poignées de la situation où myVar n'est pas déclaré.
En JavaScript, il est nul et il n'y est pas défini. Ils ont des significations différentes.
Marijn Haverbeke unis, en sa gratuit, livre en ligne "Éloquent JavaScript" (l'emphase est mienne):
Il y a également une valeur similaire, null, dont le sens est 'cette valeur est définie, mais il n'a pas de valeur". La différence de sens entre indéfini et null est la plupart du temps scolaire, et généralement pas très intéressant. Dans la pratique, il est souvent nécessaire de vérifier si quelque chose a une valeur". Dans ces cas, l'expression de quelque chose == undefined peut être utilisé, parce que, même si elles ne sont pas exactement la même valeur, la valeur null == undefined retournera true.
Alors, je pense que la meilleure façon de vérifier si quelque chose d'indéfini serait:
if (something == undefined)
Espérons que cette aide!
Edit: En réponse à votre travail d'édition, les propriétés de l'objet devrait fonctionner de la même manière.
var person = {
name: "John",
age: 28,
sex: "male"
};
alert(person.name); // "John"
alert(person.fakeVariable); // undefined
Ok. Qu'est-ce que cela signifie: "undefined propriété de l'objet"? En fait, il peut signifier deux choses tout à fait différentes! Tout d'abord, cela peut signifier que la propriété a jamais été définie dans l'objet et, deuxièmement, elle peut signifier la propriété qui a la valeur non définie. Nous allons voir à présent code:
var o = { a: undefined }
Est - o.a
undefined? Oui! Sa valeur est undefined. Est - o.b
undefined? Bien sûr! Il n'y a pas de propriété " b " à tous! Ok, voyons maintenant comment les différentes approches se comporter dans les deux situations:
typeof o.a == 'undefined' // true
typeof o.b == 'undefined' // true
o.a === undefined // true
o.b === undefined // true
'a' in o // true
'b' in o // false
Donc, nous pouvons clairement voir que, typeof obj.prop == 'undefined'
et obj.prop === undefined
sont équivalents et qu'ils ne font pas la distinction que des situations différentes. Et 'prop' in obj
peut détecter la situation de la propriété n'a pas été définie à tous et ne faites pas attention à la valeur de la propriété qui peut être indéfini.
1) Vous voulez savoir si la propriété n'est pas définie par le premier ou le deuxième sens (le plus typique de la situation).
typeof obj.prop == 'undefined' // IMHO, see "final fight" below
2) Vous voulez juste savoir si l'objet a une propriété et ne se soucient pas de sa valeur.
'prop' in obj
x.a === undefined
ou cette typeof x.a == 'undefined'
soulève ReferenceError: x is not defined
si x n'est pas définie.undefined
est une variable globale (donc, en fait, c'est - window.undefined
dans les navigateurs). Il est pris en charge depuis ECMAScript 1ère Édition et depuis ECMAScript 5, il est en lecture seule. Donc dans les navigateurs modernes, il ne peut pas être redéfini pour vrai comme de nombreux auteurs l'amour nous fait peur mais c'est toujours un vrai pour les anciens navigateurs.obj.prop === undefined
vs typeof obj.prop == 'undefined'
Avantages de l' obj.prop === undefined
:
undefined
Inconvénients obj.prop === undefined
:
undefined
peut être remplacée dans les vieux navigateursAvantages de l' typeof obj.prop == 'undefined'
:
Inconvénients typeof obj.prop == 'undefined'
:
'undefned'
ici est juste une chaîne constante, de sorte que js moteur ne peut pas vous aider si vous avez mal orthographié comme je viens de le faireNode.js prend en charge globale de la variable undefined
comme global.undefined
(peut également être utilisé sans "mondiale" de préfixe). Je ne sais pas pour les autres implémentations de serveur de côté JS.
La question se résume à trois cas:
undefined
.undefined
.Cela nous dit quelque chose que je considère importantes:
Il y a une différence entre un indéfini membre et un membre défini avec une valeur non définie.
Mais malheureusement, typeof obj.foo
ne nous dit pas lequel des trois cas que nous avons. Cependant, on peut les combiner avec d' "foo" in obj
de distinguer les cas.
| typeof obj.x === 'undefined' | !("x" in obj)
1. { x:1 } | false | false
2. { x : (function(){})() } | true | false
3. {} | true | true
Il est intéressant de noter que ces tests sont les mêmes pour null
des entrées de trop
| typeof obj.x === 'undefined' | !("x" in obj)
{ x:null } | false | false
Je dirais que dans certains cas, il est plus logique (et plus claires) pour vérifier si la propriété est là, que de vérifier si elle n'est pas définie, et le seul cas où cette vérification sera différent est le cas 2, le cas rare d'une entrée effective dans l'objet avec une valeur non définie.
Par exemple: je viens de refactoring un tas de code qui avait un tas de vérifie si un objet a une propriété donnée.
if( typeof blob.x != 'undefined' ) { fn(blob.x); }
Ce qui est plus clair lorsqu'il est écrit sans vérifier indéfini.
if( "x" in blob ) { fn(blob.x); }
Mais, comme il a été mentionné ce ne sont pas exactement les mêmes (mais qui sont plus que suffisant pour mes besoins).
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.