Comment vérifier si un objet a une propriété spécifique en JavaScript?
Considérer:
x = {'key': 1};
if ( x.hasOwnProperty('key') ) {
//Do this
}
Est-ce la meilleure façon de procéder?
javascript
sheats
la source
la source
in
ethasOwnProperty
est sorti beaucoup plus lent que les autres pour moi (98% plus lent). Je ne suis pas surpris d'hasOwnProperty
être plus lent mais je suis surprisin
.Réponses:
Je suis vraiment confus par les réponses qui ont été données - la plupart d'entre elles sont tout simplement incorrectes. Bien sûr, vous pouvez avoir des propriétés d'objet qui ont des valeurs non définies, nulles ou fausses. Donc, simplement réduire le chèque de propriété à
typeof this[property]
ou, pire encore,x.key
vous donnera des résultats complètement trompeurs.Cela dépend de ce que vous recherchez. Si vous voulez savoir si un objet contient physiquement une propriété (et qu'il ne vient pas de quelque part sur la chaîne du prototype), alors
object.hasOwnProperty
c'est la voie à suivre. Tous les navigateurs modernes le prennent en charge. (Il manquait dans les anciennes versions de Safari - 2.0.1 et antérieures - mais ces versions du navigateur ne sont plus rarement utilisées.)Si ce que vous recherchez, c'est si un objet a une propriété itérative (lorsque vous parcourez les propriétés de l'objet, il apparaîtra), puis faites:
prop in object
vous donnera l'effet souhaité.Étant donné que l'utilisation
hasOwnProperty
est probablement ce que vous voulez, et considérant que vous pouvez souhaiter une méthode de secours, je vous présente la solution suivante:Ce qui précède est une solution multi-navigateur qui fonctionne
hasOwnProperty
, avec une mise en garde: il ne peut pas distinguer les cas où une propriété identique se trouve sur le prototype et sur l'instance - il suppose simplement qu'elle provient du prototype. Vous pouvez la modifier pour qu'elle soit plus clémente ou stricte, en fonction de votre situation, mais au moins cela devrait être plus utile.la source
var w = opts.w || 100;
. Mais si vous êtes sur une sorte de bibliothèque, vous devrez peut-être aller un peu plus loin dans certaines parties.__proto__
à null? Impl simple:function hasOwnProperty(obj, prop) { var temp = obj.__proto__; obj.__proto__ = null; var ret = prop in obj; obj.__proto__ = temp; return ret; }
(le cas avecobj.constructor.prototype
doit être ajouté).__proto__
n'est pas standard et ne fonctionne pas dans certains navigateurs plus anciens. Et même avec l'ajout récent deObject.getPrototypeOf
la norme, vous ne pouvez toujours pas modifier le prototype d'un objet existant.for(prop in object)
boucle itère uniquement les propriétés énumérables. Cependant,prop in object
vérifie siobject
la propriété aprop
quelque part dans la chaîne prototypique, indépendamment du fait qu'elle soit énumérable ou non.Avec
Underscore.js
ou ( encore mieux )lodash
:Qui appelle
Object.prototype.hasOwnProperty
, mais (a) est plus court à taper, et (b) utilise "une référence sûre àhasOwnProperty
" (c'est-à-dire qu'il fonctionne même s'ilhasOwnProperty
est écrasé).En particulier, lodash définit
_.has
comme:la source
npm install lodash.has
qui expose un module npm avec juste unehas
fonction qui compile jusqu'à 175 octets lorsqu'il est minifié. Il est également intéressant de consulter lelodash.has/index.js
pour voir comment fonctionne une bibliothèque très populaire et fiable.lodash
les versions de fonctionne avec ceci:.has(undefined, 'someKey') => false
tandis queunderscore
revientundefined
lodash
une dépendance "encore une autre": c'est une bibliothèque assez courante (sinon LA plus courante) pour ce genre de chose. Amusez-vous à réinventer la roue.Qu'en est-il de?
la source
in
opérateur ou non. Notez également que l'in
opérateur a un excellent support pour le navigateurIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
vérifie également les propriétés du prototype, tout enhasOwnProperty
itérant uniquement les propriétés définies par l'utilisateur. Référence: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…'key' in x
faire travailler avectableaux. Preuve: stackoverflow.com/questions/33592385/…Remarque : ce qui suit est aujourd'hui largement obsolète grâce au mode strict, et
hasOwnProperty
. La bonne solution consiste à utiliser le mode strict et à vérifier la présence d'une propriété à l'aide deobj.hasOwnProperty
. Cette réponse est antérieure à ces deux choses, au moins aussi largement mises en œuvre (oui, c'est aussi ancien). Prenez ce qui suit comme une note historique.Gardez à l'esprit que ce
undefined
n'est (malheureusement) pas un mot réservé en JavaScript si vous n'utilisez pas le mode strict. Par conséquent, quelqu'un (quelqu'un d'autre, évidemment) pourrait avoir la grande idée de le redéfinir, de casser votre code.Une méthode plus robuste est donc la suivante:
D'un autre côté, cette méthode est beaucoup plus verbeuse et aussi plus lente. : - /
Une alternative courante consiste à s'assurer qu'il
undefined
n'est pas réellement défini, par exemple en plaçant le code dans une fonction qui accepte un paramètre supplémentaire, appeléundefined
, auquel aucune valeur n'est transmise. Pour vous assurer qu'il ne soit pas passé une valeur, vous pouvez simplement l'appeler vous-même immédiatement, par exemple:la source
void 0
défini pour renvoyer le canoniqueundefined
, pourrait-on fairex.attribute !== void 0
?(function (undefined) { // undefined is actually undefined here })();
Armin Ronacher semble m'avoir déjà battu , mais:
Une plus sûre, mais une solution plus lente, comme l' a souligné par Konrad Rudolph et Armin Ronacher serait:
la source
x.hasOwnProperty('toString') === true;
Object.prototype
a déjà un intégré, correcthasOwnProperty
. Le remplacer par une implémentation incorrecte (1. Les propriétés peuvent avoir la valeurundefined
, 2. Cela donnera des faux positifs pour les propriétés héritées) n'est qu'une horriblement mauvaise idée. Les réponses incorrectes peuvent et doivent être supprimées. Je ne sais pas si vous pouviez le faire en septembre 2008 lorsque vous avez vu la réponse de Resig , alors commentez pour suggérer de le faire maintenant.Vous pouvez utiliser l'
in
opérateur pour vérifier si la propriété existe sur un objet:Vous pouvez également parcourir toutes les propriétés de l'objet à l'aide d'une
for - in
boucle, puis rechercher la propriété spécifique:Vous devez déterminer si cette propriété d'objet est énumérable ou non, car les propriétés non énumérables n'apparaîtront pas dans une
for-in
boucle. De plus, si la propriété énumérable recouvre une propriété non énumérable du prototype, elle n'apparaîtra pas dans Internet Explorer 8 et versions antérieures.Si vous souhaitez une liste de toutes les propriétés d'instance, qu'elles soient énumérables ou non, vous pouvez utiliser
Cela renverra un tableau de noms de toutes les propriétés qui existent sur un objet.
Enfin, vous pouvez utiliser l'opérateur typeof pour vérifier directement le type de données de la propriété d'objet:
Si la propriété n'existe pas sur l'objet, elle renverra la chaîne non définie. Sinon, il renverra le type de propriété approprié. Cependant, notez que ce n'est pas toujours un moyen valide de vérifier si un objet a une propriété ou non, car vous pourriez avoir une propriété définie sur undefined, auquel cas, l'utilisation
typeof x.key
retournerait toujours true (même si la clé est toujours dans l'objet).Mise à jour: vous pouvez vérifier si une propriété existe en la comparant à la propriété javascript non définie
Cela devrait fonctionner sauf si la clé a été spécifiquement définie
undefined
sur l'objet xla source
Supprimons ici une certaine confusion. Tout d'abord, simplifions en supposant
hasOwnProperty
qu'il existe déjà; cela est vrai de la grande majorité des navigateurs actuellement utilisés.hasOwnProperty
renvoie true si le nom d'attribut qui lui est transmis a été ajouté à l'objet. Elle est entièrement indépendante de la valeur réelle qui lui est attribuée, ce qui peut être exactementundefined
.Par conséquent:
Toutefois:
Le problème est ce qui se passe quand un objet de la chaîne prototype a un attribut avec la valeur indéfinie?
hasOwnProperty
sera faux pour cela, et il en sera de même!== undefined
. Encore,for..in
listera toujours dans l'énumération.L'essentiel est qu'il n'y a pas de moyen multi-navigateur (car Internet Explorer ne l'expose pas
__prototype__
) pour déterminer qu'un identifiant spécifique n'a pas été attaché à un objet ou quoi que ce soit dans sa chaîne de prototype.la source
Si vous recherchez une propriété, alors "NON". Tu veux:
En général, vous ne devez pas vous soucier de savoir si la propriété provient ou non du prototype ou de l'objet.
Cependant, comme vous avez utilisé «clé» dans votre exemple de code, il semble que vous traitez l'objet comme un hachage, auquel cas votre réponse aurait du sens. Toutes les clés de hachage seraient des propriétés dans l'objet, et vous évitez les propriétés supplémentaires apportées par le prototype.
La réponse de John Resig était très complète, mais je pensais que ce n'était pas clair. Surtout avec quand utiliser "'prop' in obj".
la source
in
opérateur a un excellent support de navigateurIE 5.5+, Chrome 1.0+, Firefox 1.0+, Safari 3.0+
stackoverflow.com/questions/2920765/…in
opérateur: "il fonctionne avec des" objets "au sens étroit, donc déclarés comme {} ou créés à l'aide d'un constructeur, il n'accepte pas les tableaux ou les primitives. Non pas que l'OP l'ait exigé, mais d'autres réponses présentent des techniques plus larges (travail avec des tableaux, des chaînes, etc.) "Pour tester des objets simples, utilisez:
if (obj[x] !== undefined)
Si vous ne savez pas de quel type d'objet il s'agit:
if (obj.hasOwnProperty(x))
Toutes les autres options sont plus lentes ..
Détails
Évaluation des performances de 100 000 000 de cycles sous Nodejs pour les 5 options suggérées par d'autres ici:
L'évaluation nous dit que si nous ne voulons pas spécifiquement vérifier la chaîne prototype de l'objet ainsi que l'objet lui-même, nous ne devons pas utiliser la forme courante:
if (X in Obj)...
elle est entre 2 à 6 fois plus lente selon le cas d'utilisationEn résumé, si votre Obj n'est pas nécessairement un simple objet et que vous souhaitez éviter de vérifier la chaîne prototype de l'objet et vous assurer que x appartient directement à Obj, utilisez `` if (obj.hasOwnProperty (x)) ... ''.
Sinon, lorsque vous utilisez un objet simple et ne vous inquiétez pas de la chaîne de prototype de l'objet, utilisez
if (typeof(obj[x]) !== 'undefined')...
est le moyen le plus sûr et le plus rapide.Si vous utilisez un objet simple comme table de hachage et ne faites jamais rien de bizarre, j'utiliserais
if (obj[x])...
car je le trouve beaucoup plus lisible.S'amuser.
la source
Oui c'est :) Je pense que vous pouvez également faire
Object.prototype.hasOwnProperty.call(x, 'key')
ce qui devrait également fonctionner six
a une propriété appeléehasOwnProperty
:)Mais cela teste ses propres propriétés. Si vous souhaitez vérifier s'il possède une propriété qui peut également être héritée, vous pouvez l'utiliser
typeof x.foo != 'undefined'
.la source
Parce que
échoue si
x.key
résoutfalse
(par exemplex.key = ""
).la source
const x = {key: undefined};
qui retournera false avec cette solution, tandis quex.hasOwnProperty('key')); // true
etReflect.has(x, 'key')); // true
. La propriété existe réellement, mais la valeur estundefined
.Vous pouvez également utiliser l'
Reflect
objet ES6 :La documentation sur MDN pour
Reflect.has
peut être trouvée ici .la source
OK, il semble que j'aie eu la bonne réponse, sauf si vous ne voulez pas de propriétés héritées:
Voici quelques autres options pour inclure des propriétés héritées:
la source
var x = { key: false };
lax.key
méthode serait incorrecte.Ne faites pas cela
object.hasOwnProperty(key))
, c'est vraiment mauvais parce que ces méthodes peuvent être masquées par des propriétés sur l'objet en question - considérez{ hasOwnProperty: false }
- ou, l'objet peut être un objet nul(Object.create(null))
.La meilleure façon est de faire
Object.prototype.hasOwnProperty.call(object, key)
ou de:la source
Une autre façon relativement simple consiste à utiliser
Object.keys
. Cela renvoie unarray
qui signifie que vous obtenez toutes les fonctionnalités d'un tableau.Bien que nous soyons dans un monde avec une excellente prise en charge du navigateur. Parce que cette question est si ancienne, j'ai pensé ajouter ceci: Ceci est sûr à utiliser depuis JS v1.8.5
la source
Object.keys(info).indexOf('someotherthing') !== -1
hasOwnProperty "peut être utilisé pour déterminer si un objet a la propriété spécifiée comme propriété directe de cet objet. Contrairement à l'opérateur in , cette méthode ne vérifie pas la chaîne de prototypes de l'objet."
Donc, très probablement, pour ce qui semble être votre question, vous ne voulez pas utiliser hasOwnProperty, qui détermine si la propriété existe comme attachée directement à l'objet lui-même -
Si vous souhaitez déterminer si la propriété existe dans la chaîne de prototypes que vous souhaitez utiliser, comme:
J'espère que ça aide.
la source
Avec un risque de vote en aval massif, voici une autre option pour un cas spécifique. :)
Si vous souhaitez tester un membre sur un objet et savoir s'il a été défini sur autre chose que:
alors vous pouvez utiliser:
la source
Solution ECMA Script 6 avec réflexion. Créez un wrapper comme:
la source
Il existe une méthode "hasOwnProperty" existe sur l'objet, mais il n'est pas recommandé d'appeler cette méthode directement car il se peut que parfois l'objet soit nul ou qu'une propriété existe sur l'objet comme:
{ hasOwnProperty: false }
La meilleure façon serait donc:
la source
Vous pouvez utiliser les approches suivantes-
Les différences entre les approches suivantes sont les suivantes:
la source
Vous devez utiliser la méthode
object.hasOwnProperty(property)
. Elle renvoie true si l'objet a la propriété et false si l'objet ne l'est pas.la source
Si la clé que vous vérifiez est stockée dans une variable , vous pouvez la vérifier comme ceci:
la source
Pourquoi trop compliquer les choses quand vous pouvez le faire:
Simple et clair pour la plupart des cas ...
la source
const objectName = { keyname: false };
il devrait retourner true, puisquekeyname
c'est une propriété deobjectname
. Mais comme la valeur est fausse, elle retournerait fausse avec cette logique.