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.