Esiste un operatore "non in" in JavaScript per controllare le proprietà degli oggetti?


184

Esiste un tipo di operatore "non in" in JavaScript per verificare se una proprietà non esiste in un oggetto? Non sono riuscito a trovare nulla al riguardo su Google o StackTranslate.it. Ecco un piccolo frammento di codice su cui sto lavorando dove ho bisogno di questo tipo di funzionalità:

var tutorTimes = {};

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

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

Come puoi vedere, metterei tutto nella elsedichiarazione. Mi sembra sbagliato impostare un'istruzione if- elsesolo per usare la elseporzione.


4
Penso che potresti desiderare var id = ...nella tua funzione.
Cobby,

Risposte:


339

Mi sembra sbagliato impostare un'istruzione if / else solo per usare la parte else ...

Basta negare la tua condizione e otterrai la elselogica all'interno di if:

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

11
Questo stile corregge anche l'avviso "Uso confuso di '!" Di ( ! somekey in someobj )
JSHint

3
Si noti che nelle ricerche per il nome della proprietà in qualsiasi punto della catena del prototipo. Vedi la mia risposta per maggiori dettagli.
un po '

25
Capisco che questa sia attualmente la soluzione migliore, ma qualcun altro è d'accordo sul fatto che sia un po 'brutto?
Giona

3
Se è brutto, basta avvolgerlo in una funzione e dargli un bel nome 🙃let keyExists = (key, obj) => key in obj
Kamafeather,

Sono totalmente d'accordo. In effetti, anche le mie capacità di denominazione potrebbero essere migliorate 😁. let hasProperty"sembra" migliore
Kamafeather il

37

Come già detto da Jordão, basta negarlo:

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

Nota: il test sopra riportato se tutorTimes ha una proprietà con il nome specificato in id, ovunque nella catena del prototipo. Ad esempio, "valueOf" in tutorTimesrestituisce true perché è definito in Object.prototype .

Se si desidera verificare se una proprietà non esiste nell'oggetto corrente, utilizzare hasOwnProperty:

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

O se potresti avere una chiave che è hasOwnPropery puoi usare questo:

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

È più sicuro racchiudere la chiave tra virgolette e utilizzarla if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour,

@MajidFouladpour idè una variabile che potrebbe avere qualsiasi valore, 'id'è una stringa con i due lettere i e d , quindi hasOwnProperty(id)controlla se la proprietà specificata nella variabile id esiste, e hasOwnProperty('id')controlla se v'è una proprietà denominata id.
circa

17

Personalmente trovo

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

più facile da leggere di

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

ma entrambi funzioneranno.


14

Due possibilità rapide:

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

o

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

5
Usa 'undefined' === typeof xxxinvece. undefinednon è una parola riservata ed è in realtà una variabile globale che può essere sovrascritta (portando a bug difficili da trovare)
hugomg

9
@hippietrail non funziona ... le parentesi sono necessarie dopo il "!" e intorno al'foo' in myObj)
Phil Cooper

4
myObj['foo']potrebbe esistere come proprietà ed essere semplicemente impostato su undefined(ovvero, con la dichiarazione myObj.foo = undefined). Se vuoi davvero vedere se la proprietà stessa non esiste, hai bisogno della !('foo' in myObj)notazione.
Richard Connamacher,

Per le persone attente alle prestazioni, il controllo myObj.foo === undefinedè molto più rapido (sebbene potenzialmente pericoloso): jsperf.com/not-in-vs-is-undefined .
etpinard,

@hugomg Non penso che sia un ottimo argomento per non usarlo === undefined. Molte cose possono rompersi se le persone abusano di un linguaggio di programmazione facendo cose come, ad esempio, la sovrascrittura undefinedin JavaScript. Inoltre, si veda: stackoverflow.com/questions/8783510/...
Zero3
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.