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?

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

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

18

Underscore.js lub Lodash

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

:)


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

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.


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

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

1
Ponieważ jest źle czytać i nie pisać ściśle. Muszę cię zapytać: dlaczego nie po prostu x.hasOwnProperty('y')?
Fabian Picone
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.