Existe-t-il un opérateur «pas dans» dans JavaScript pour vérifier les propriétés des objets?


184

Existe-t-il une sorte d'opérateur "pas dans" en JavaScript pour vérifier si une propriété n'existe pas dans un objet? Je n'ai rien trouvé à ce sujet dans Google ou Stack Overflow. Voici un petit extrait de code sur lequel je travaille où j'ai besoin de ce type de fonctionnalité:

var tutorTimes = {};

$(checked).each(function(idx){
  id = $(this).attr('class');

  if(id in tutorTimes){}
  else{
    //Rest of my logic will go here
  }
});

Comme vous pouvez le voir, je mettrais tout dans la elsedéclaration. Il me semble erroné de créer une déclaration if- elsejuste pour utiliser la elsepartie.


4
Je pense que vous voudrez peut-être var id = ...dans votre fonction.
Cobby

Réponses:


340

Il me semble incorrect de configurer une instruction if / else juste pour utiliser la partie else ...

Annulez simplement votre condition et vous obtiendrez la elselogique à l'intérieur du if:

if (!(id in tutorTimes)) { ... }

11
Ce style corrige également l'avertissement JSHint "Utilisation confuse de '!'" Que vous auriez si vous le ( ! somekey in someobj )
faisiez

3
Veuillez noter que dans les recherches pour le nom de la propriété n'importe où dans la chaîne de prototypes. Voir ma réponse pour plus de détails.
certains

25
Je comprends que c'est actuellement la meilleure solution, mais est-ce que quelqu'un d'autre convient que c'est un peu moche?
Jonah

3
Si c'est moche, enveloppez-le simplement dans une fonction et donnez-lui un beau nom 🙃let keyExists = (key, obj) => key in obj
Kamafeather

Je suis tout à fait d'accord. En effet, mes compétences en matière de dénomination pourraient également être améliorées 😁. let hasProperty"regarde" mieux
Kamafeather

37

Comme l'a déjà dit Jordão, niez-le:

if (!(id in tutorTimes)) { ... }

Remarque: Le test ci-dessus teste si tutorTimes a une propriété avec le nom spécifié dans id, n'importe où dans la chaîne de prototypes. Par exemple, "valueOf" in tutorTimesrenvoie true car il est défini dans Object.prototype .

Si vous souhaitez tester si une propriété n'existe pas dans l'objet actuel, utilisez hasOwnProperty:

if (!tutorTimes.hasOwnProperty(id)) { ... }

Ou si vous avez une clé hasOwnPropery, vous pouvez utiliser ceci:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }

Est-il plus sûr de mettre la clé entre guillemets et de l'utiliser if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour

@MajidFouladpour idest une variable qui pourrait avoir n'importe quelle valeur, 'id'est une chaîne avec les deux lettres i et d , hasOwnProperty(id)vérifie donc si la propriété spécifiée dans la variable id existe et hasOwnProperty('id')vérifie s'il existe une propriété nommée id.
certains

18

Personnellement je trouve

if (id in tutorTimes === false) { ... }

plus facile à lire que

if (!(id in tutorTimes)) { ... }

mais les deux fonctionneront.


14

Deux possibilités rapides:

if(!('foo' in myObj)) { ... }

ou

if(myObj['foo'] === undefined) { ... }

5
Utilisez 'undefined' === typeof xxxplutôt. undefinedn'est pas un mot réservé et est en fait une variable globale qui peut être écrasée (conduisant à des bogues difficiles à trouver)
hugomg

9
@hippietrail ne fonctionne pas ... les parenthèses sont obligatoires après le "!" et autour du'foo' in myObj)
Phil Cooper

4
myObj['foo']pourrait exister en tant que propriété et être simplement défini sur undefined(c'est- à -dire avec l'instruction myObj.foo = undefined). Si vous voulez vraiment voir si la propriété elle-même n'existe pas, vous avez besoin de la !('foo' in myObj)notation.
Richard Connamacher le

Pour ceux qui sont conscients de la performance parmi nous, la vérification myObj.foo === undefinedest beaucoup plus rapide (quoique potentiellement dangereuse): jsperf.com/not-in-vs-is-undefined .
etpinard

@hugomg Je ne pense pas que ce soit un très bon argument pour ne pas utiliser === undefined. Beaucoup de choses peuvent casser si les gens abusent d'un langage de programmation en faisant des choses comme, par exemple, l'écrasement undefineden JavaScript. Voir aussi: stackoverflow.com/questions/8783510/…
Zero3
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.