Gibt es in JavaScript einen "nicht in" -Operator zum Überprüfen der Objekteigenschaften?

182

Gibt es in JavaScript einen Operator "nicht in", mit dem überprüft werden kann, ob eine Eigenschaft in einem Objekt nicht vorhanden ist? Ich konnte nichts über Google oder Stack Overflow finden. Hier ist ein kleiner Codeausschnitt, an dem ich arbeite, wo ich diese Art von Funktionalität benötige:

var tutorTimes = {};

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

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

Wie Sie sehen können, würde ich alles in die elseErklärung aufnehmen. Es scheint mir falsch, eine if- elseAnweisung zu erstellen, nur um den elseTeil zu verwenden.

Aaron
quelle
4
Ich denke, Sie möchten vielleicht var id = ...in Ihrer Funktion.
Cobby

Antworten:

337

Es scheint mir falsch, eine if / else-Anweisung einzurichten, um nur den else-Teil zu verwenden ...

Negieren Sie einfach Ihren Zustand und Sie erhalten die elseLogik in if:

if (!(id in tutorTimes)) { ... }
Jordão
quelle
11
Dieser Stil behebt auch die JSHint-Warnung "Verwirrende Verwendung von '!'", Die Sie erhalten würden, wenn Sie dies ( ! somekey in someobj )
tun
3
Bitte beachten Sie, dass bei der Suche nach dem Eigenschaftsnamen irgendwo in der Prototypenkette. Siehe meine Antwort für weitere Details.
einige
25
Ich verstehe, dass dies derzeit die beste Lösung ist, aber stimmt jemand zu, dass dies irgendwie hässlich ist?
Jonah
3
Wenn es hässlich ist, wickeln Sie es einfach in eine Funktion ein und geben Sie ihm einen schönen Namen 🙃let keyExists = (key, obj) => key in obj
Kamafeather
Ich bin vollkommen einverstanden. In der Tat könnten auch meine Benennungsfähigkeiten verbessert werden 😁. let hasProperty"sieht" besser aus
Kamafeather
37

Wie bereits von Jordão gesagt, negiere es einfach:

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

Hinweis: Der obige Test, wenn tutorTimes eine Eigenschaft mit dem in id angegebenen Namen an einer beliebigen Stelle in der Prototypkette hat. Gibt beispielsweise true"valueOf" in tutorTimes zurück , da es in Object.prototype definiert ist .

Wenn Sie testen möchten, ob im aktuellen Objekt keine Eigenschaft vorhanden ist, verwenden Sie hasOwnProperty:

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

Oder wenn Sie einen Schlüssel haben, der hasOwnPropery ist, können Sie diesen verwenden:

if (!Object.prototype.hasOwnProperty.call(tutorTimes,id)) { ... }
etwas
quelle
Ist es sicherer , den Schlüssel in Anführungszeichen zu setzen und zu verwenden if(!tutorTimes.hasOwnProperty('id')) ...?
Majid Fouladpour
@MajidFouladpour idist eine Variable, die einen beliebigen Wert haben kann. Es 'id'handelt sich um eine Zeichenfolge mit den beiden Buchstaben i und d . hasOwnProperty(id)Überprüfen Sie daher , ob die in der Variablen- ID angegebene Eigenschaft vorhanden ist, und hasOwnProperty('id')ob eine Eigenschaft mit dem Namen id vorhanden ist.
einige
16

Persönlich finde ich

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

leichter zu lesen als

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

aber beide werden funktionieren.

Futter
quelle
14

Zwei schnelle Möglichkeiten:

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

oder

if(myObj['foo'] === undefined) { ... }
Reedlauber
quelle
5
Verwenden Sie 'undefined' === typeof xxxstattdessen. undefinedist kein reserviertes Wort und ist tatsächlich eine globale Variable, die überschrieben werden kann (was zu schwer zu findenden Fehlern führt)
hugomg
9
@hippietrail funktioniert nicht ... die Parens werden nach dem "!" und um die'foo' in myObj)
Phil Cooper
4
myObj['foo']könnte als Eigenschaft existieren und einfach auf undefined(dh mit der Anweisung myObj.foo = undefined) gesetzt werden. Wenn Sie wirklich sehen möchten, ob die Eigenschaft selbst nicht vorhanden ist, benötigen Sie die !('foo' in myObj)Notation.
Richard Connamacher
Für die Leistungsbewussten unter uns ist die Überprüfung myObj.foo === undefinedviel schneller (wenn auch potenziell gefährlich): jsperf.com/not-in-vs-is-undefined .
Etpinard
@hugomg Ich denke nicht, dass dies ein sehr gutes Argument dafür ist, nicht zu verwenden === undefined. Viele Dinge können kaputt gehen, wenn Leute eine Programmiersprache missbrauchen, indem sie beispielsweise undefinedJavaScript überschreiben . Siehe auch: stackoverflow.com/questions/8783510/…
Zero3