So bestimmen Sie, ob ein Objekt eine bestimmte Eigenschaft in JavaScript hat

311

Wie kann ich feststellen, ob ein Objekt xeine definierte Eigenschaft hat y, unabhängig vom Wert von x.y?

Ich benutze gerade

if (typeof(x.y) !== 'undefined')

aber das scheint ein bisschen klobig. Gibt es einen besseren Weg?

Royhowie
quelle

Antworten:

584

Objekt hat Eigenschaft:

Wenn Sie nach Eigenschaften suchen, die sich auf dem Objekt selbst befinden (nicht Teil seiner Prototypkette), können Sie Folgendes verwenden .hasOwnProperty():

if (x.hasOwnProperty('y')) { 
  // ......
}

Objekt oder sein Prototyp hat eine Eigenschaft:

Mit dem inOperator können Sie nach Eigenschaften suchen, die ebenfalls vererbt werden.

if ('y' in x) {
  // ......
}
Zwerg
quelle
23
Oder noch besser - Object.prototype.hasOwnProperty.call(x, 'y')damit die Eigenschaft "hasOwnProperty" nicht mit dem Inspektionsprozess in Konflikt steht;)
kangax
4
Oder noch kürzer - {}.hasOwnProperty.call(x, 'y').
Axmrnv
78

Wenn Sie wissen möchten, ob das Objekt die Antwort von property @ gnarf physisch enthält , wird die Arbeit erledigthasOwnProperty .

Wenn Sie wissen möchten, ob die Eigenschaft irgendwo vorhanden ist, entweder auf dem Objekt selbst oder in der Prototypenkette, können Sie den inOperator verwenden .

if ('prop' in obj) {
  // ...
}

Z.B.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
CMS
quelle
18

Underscore.js oder Lodash

if (_.has(x, "y")) ...

:) :)

nackjicholson
quelle
Nee. Es ist nur ein Alias ​​für Object.prototype.hasOwnProperty.call(x, "y"). Für Arrays denke ich , möchten Sie vielleicht Array.prototype.indexOf, _.indexOfoder_.contains
nackjicholson
13

Sie können das ein bisschen wie folgt kürzen:

if ( x.y !== undefined ) ...
jpsimons
quelle
15
Das würde scheitern mitx = {y:undefined}
James
20
Muss jemand zwischen "nicht definiert" und "definiert, um undefiniert zu sein" unterscheiden?
Jpsimons
16
@darkporter mache ich manchmal;)
mmm
6

Ein Merkmal meines ursprünglichen Codes

if ( typeof(x.y) != 'undefined' ) ...

In einigen Situationen kann dies nützlich sein, da die Verwendung sicher ist, unabhängig davon, ob sie xvorhanden ist oder nicht. Bei beiden Methoden in der Antwort von Gnarf sollte zunächst geprüft werden, xob Zweifel bestehen.

Vielleicht haben alle drei Methoden einen Platz in der Trickkiste.


quelle
Sie könnten immer (x && x.hasOwnProperty('y'))oder(x && 'y' in x)
Gnarf
Ich bin damit einverstanden, dass das Testen auf x für sich genommen ein separater Fall sein sollte. Ergibt auch eine bessere Fehlerberichterstattung.
B01
Das ist mir nicht gelungen. Wenn x undefiniert ist, gibt typeof (xy) ReferenceErroranstelle der Zeichenfolge 'undefined' einen zurück
Craig
1

Da die Frage die Unbeholfenheit der Eigenschaftsprüfung betraf und ein regelmäßiger Verwendungszweck die Validierung von Objekten mit Funktionsargumentoptionen war, dachte ich, ich würde eine bibliotheksfreie Kurzmethode zum Testen der Existenz mehrerer Eigenschaften erwähnen. Haftungsausschluss: Es erfordert ECMAScript 5 (aber IMO verdient jeder, der noch IE8 verwendet, ein kaputtes Web).

function f(opts) {
  if(!["req1","req2"].every(opts.hasOwnProperty, opts)) {
      throw new Error("IllegalArgumentException");
  }
  alert("ok");
}
f({req1: 123});  // error
f({req1: 123, req2: 456});  // ok
stt
quelle
-2

Warum nicht einfach:

if (typeof myObject.myProperty == "undefined") alert("myProperty is not defined!");

Oder wenn Sie einen bestimmten Typ erwarten:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
Kuppel
quelle
1
Weil es schlecht zu lesen ist und nicht streng tippt. Ich muss dich fragen: warum nicht einfach x.hasOwnProperty('y')?
Fabian Picone