Jak ustalić, czy obiekt ma daną właściwość w JavaScript

311

Jak mogę ustalić, czy obiekt xma zdefiniowaną właściwość y, niezależnie od wartości x.y?

Obecnie używam

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

ale to wydaje się trochę niezgrabne. Czy jest lepszy sposób?

royhowie
źródło

Odpowiedzi:

584

Obiekt ma właściwość:

Jeśli testujesz właściwości, które znajdują się na samym obiekcie (nie stanowiącym części łańcucha jego prototypów), możesz użyć .hasOwnProperty():

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

Obiekt lub jego prototyp ma właściwość:

Możesz użyć inoperatora do testowania również dziedziczonych właściwości.

if ('y' in x) {
  // ......
}
gnarf
źródło
23
Albo jeszcze lepiej - Object.prototype.hasOwnProperty.call(x, 'y')aby właściwość o nazwie „hasOwnProperty” nie kolidowała z procesem inspekcji;)
kangax
4
Lub nawet krócej {}.hasOwnProperty.call(x, 'y').
axmrnv
78

Jeśli chcesz wiedzieć, czy obiekt fizycznie zawiera właściwość @ gnarf, skorzystaj z odpowiedzi hasOwnProperty.

Jeśli chcesz wiedzieć, czy właściwość istnieje gdziekolwiek, na samym obiekcie lub w łańcuchu prototypów, możesz użyć inoperatora .

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

Na przykład.:

var obj = {};

'toString' in obj == true; // inherited from Object.prototype
obj.hasOwnProperty('toString') == false; // doesn't contains it physically
CMS
źródło
18

Underscore.js lub Lodash

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

:)

nackjicholson
źródło
Nie. To tylko pseudonim dla Object.prototype.hasOwnProperty.call(x, "y"). Dla tablic myślę, że chcesz Array.prototype.indexOf, _.indexOflub_.contains
nackjicholson
13

Możesz to trochę przyciąć w ten sposób:

if ( x.y !== undefined ) ...
jpsimons
źródło
15
To by się nie udałox = {y:undefined}
James
20
Czy ktoś musi odróżniać „niezdefiniowany” od „zdefiniowany jako niezdefiniowany”?
jpsimons,
16
@darkporter Czasami tak;)
mmm
6

Jedna cecha mojego oryginalnego kodu

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

w niektórych sytuacjach może być użyteczne to, że można bezpiecznie używać, czy xistnieje, czy nie. W przypadku jednej z metod zawartych w odpowiedzi gnarf należy najpierw sprawdzić, xczy istnieją wątpliwości, czy istnieje.

Być może więc wszystkie trzy metody mają miejsce w woreczku sztuczek.


źródło
Zawsze możesz użyć (x && x.hasOwnProperty('y'))or(x && 'y' in x)
gnarf
Zgadzam się, testowanie x powinno być osobnym przypadkiem. Daje także lepsze raportowanie błędów.
b01
To mi się nie udało. Jeśli x jest niezdefiniowany, to typeof (xy) zwraca ReferenceErrorraczej niż ciąg „undefined”
Craig
1

Ponieważ pytanie dotyczyło niezgrabności sprawdzania właściwości, a jedną regularną sprawą do tego jest sprawdzanie poprawności obiektów argumentów funkcji, pomyślałem, że wspomnę o bezbibliotecznym krótkim sposobie testowania istnienia wielu właściwości. Oświadczenie: Wymaga ECMAScript 5 (ale IMO, kto nadal używa IE8, zasługuje na zepsutą sieć).

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
źródło
-2

Dlaczego nie po prostu:

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

Lub jeśli oczekujesz określonego typu:

if (typeof myObject.myProperty != "string") alert("myProperty has wrong type or does not exist!");
Kopuła
źródło
1
Ponieważ jest źle czytać i nie pisać ściśle. Muszę cię zapytać: dlaczego nie po prostu x.hasOwnProperty('y')?
Fabian Picone