Odpowiedzi:
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')) {
// ......
}
Możesz użyć in
operatora do testowania również dziedziczonych właściwości.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y')
.
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ć in
operatora .
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
Underscore.js lub Lodash
if (_.has(x, "y")) ...
:)
Object.prototype.hasOwnProperty.call(x, "y")
. Dla tablic myślę, że chcesz Array.prototype.indexOf
, _.indexOf
lub_.contains
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 x
istnieje, czy nie. W przypadku jednej z metod zawartych w odpowiedzi gnarf należy najpierw sprawdzić, x
czy istnieją wątpliwości, czy istnieje.
Być może więc wszystkie trzy metody mają miejsce w woreczku sztuczek.
(x && x.hasOwnProperty('y'))
or(x && 'y' in x)
ReferenceError
raczej niż ciąg „undefined”
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
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!");
x.hasOwnProperty('y')
?
Object.prototype.hasOwnProperty.call(x, 'y')
aby właściwość o nazwie „hasOwnProperty” nie kolidowała z procesem inspekcji;)