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?

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) {
  // ......
}

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

18

Underscore.js oder Lodash

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

:) :)


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 ) ...

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.


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

-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!");

1
Weil es schlecht zu lesen ist und nicht streng tippt. Ich muss dich fragen: warum nicht einfach x.hasOwnProperty('y')?
Fabian Picone
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.