Undefined, typeof undefined, hasOwnProperty
Prendre cet extrait,
var a = {
}
if(typeof a.c === 'undefined'){
console.log('inside if');
}
if(a.c === undefined){
console.log('inside if');
}
Les deux if
résultats dans true
. Quelle est la différence dans les deux déclarations spécifiques à certains navigateurs?
Aussi, dans mon dernier projet, j'ai déjà utilisé typeof a.c == 'undefined'
de nombreuses fois afin de vérifier les valeurs dans json
de données.
Maintenant, je sais que ce n'est pas de la bonne manière, comme certains de la valeur peut être undefined
trop, donc ma logique échoue.
Je devrais avoir utilisé hasOwnProperty
.
Mais je suis sûr qu'aucune valeur ne sera undefined
, puis-je utiliser typeof a.c == 'undefined'
en place de hasOwnProperty
ou dois-je changer tous mes typeof
avec hasOwnProperty
source d'informationauteur Jashwant
Vous devez vous connecter pour publier un commentaire.
(Mise à JOUR: Vous pourriez vouloir vérifier cette question: variable === undefined vs typeof variable === "undefined").
Dans très les anciens navigateurs (Netscape 2, IIRC, et, éventuellement, IE 4 ou moins), on ne peut pas comparer une valeur avec
undefined
depuis que l'origine d'une erreur. Dans tous les (semi-) navigateur moderne, cependant, il n'y a aucune raison pour vérifiertypeof value === 'undefined'
au lieu devalue === undefined
(à l'exception de la paranoïa que quelqu'un peut avoir redéfini la variableundefined
).hasOwnProperty
sert un but différent. Il vérifie si l'objet possède une propriété dont le nom donné, et pas son prototype; c'est à dire indépendamment des propriétés héritées. Si vous voulez vérifier si un objet contient une certaine propriété, héréditaires ou non, vous devez utiliserif ('c' in a) {
...Mais, fondamentalement, ils seront probablement tous les travaux:
La principale différence étant que:
a.c === undefined
va produire un résultat inattendu si quelqu'un a faitundefined = 'defined'
ou un truc;!('c' in a)
n'est pas très lisible (à mon humble avis)!a.hasOwnProperty('c')
sera de retourfalse
si l'objeta
ne contient pas une propriétéc
mais son prototype.Personnellement, je préfère le premier car il est plus lisibles. Si vous êtes paranoïaque et pour éviter le risque d'une nouvelle définition de l'
undefined
enveloppez votre code dans une auto-exécution de la fonction anonyme comme suit:Si votre vérification standard des objets qui sont le résultat de l'analyse d'une chaîne JSON,
.hasOwnProperty
n'a pas d'avantage évident. Sauf, bien sûr, si vous-même ou certains lib vous utilisez a été déconner avec leObject.prototype
.En général,
undefined
en tant que telle peut être redéfini, mais je n'ai pas rencontré moi-même - je ne crois pas que je vais jamais le faire. Il est toutefois impossible (à ma connaissance) à gâcher les valeurs de retour detypeof
. À cet égard, le dernier est le plus sûr moyen d'aller. Je crois que certains anciens navigateurs ne fonctionnent pas bien avec leundefined
mot-clé, trop.À la reprise de l': pas besoin d'aller et de remplacer tous les
typeof
vérifier. Sur une note personnelle: je crois qu'il est de bonne pratique d'obtenir dans l'habitude de l'utiliser.hasOwnProperty
cependant. Donc je proposerais que, dans le cas d'une propriété pourrait exister, mais être indéfini,.hasOwnPorperty
est le pari le plus sûr.En réponse à votre commentaire: oui,
typeof
adaptée à vos besoins ~95% du temps..hasOwnProperty
travaillera 99% des fois. Toutefois, comme le nom l'indique: les propriétés de plus haut dans la chaîne d'héritage ne sera pas vérifié, considérons l'exemple suivant:Donc, si vous voulez vérifier si un objet possède une propriété,
hasOwnProperty
est ce que vous avez besoin. Surtout si vous allez pour changer la valeur de la propriété (si c'est un prototype de la propriété, toutes les instances peuvent être modifiés).Si vous voulez savoir si un bien a une valeur (autres que
undefined
), indépendamment de l'endroit où il est situé dans la chaîne d'héritage, vous aurez besointypeof
. J'ai une fonction récursive quelque part pour déterminer où la propriété peut être trouvée dans l'héritage de la chaîne. Une fois que je l'ai trouvé, je vais le poster ici, trop.Mise à jour:
Comme promis, la fonction pour trouver une propriété dans une chaîne d'héritage. Ce n'est pas la fonction que j'ai utilisé pendant un certain temps, j'ai donc monté un projet de travail. Il n'est pas parfait, mais il pourrait bien vous aider sur votre chemin:
Pour éviter ce dernier problème, vous pouvez soit remplacer la dernière
return current;
déclaration avecreturn obj;
. Ou, mieux encore, ajoutez la ligne suivante à l'extrait ci-dessus:J'ai oublié que dans la première édition...
Copier les propriétés énumérables de p à o, et retour o.
Si o et p ont une propriété du même nom, o la propriété est laissé seul.
Cette fonction ne gère pas les getters et les setters ou copier les attributs.
Quelle est la différence entre
o.hasOwnProperty[prop]
eto.hasOwnProperty(prop)
?