Antworten:
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')) {
// ......
}
Mit dem inOperator können Sie nach Eigenschaften suchen, die ebenfalls vererbt werden.
if ('y' in x) {
// ......
}
{}.hasOwnProperty.call(x, 'y').
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
Underscore.js oder Lodash
if (_.has(x, "y")) ...
:) :)
Object.prototype.hasOwnProperty.call(x, "y"). Für Arrays denke ich , möchten Sie vielleicht Array.prototype.indexOf, _.indexOfoder_.contains
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.
(x && x.hasOwnProperty('y'))oder(x && 'y' in x)
ReferenceErroranstelle der Zeichenfolge 'undefined' einen zurück
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
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!");
x.hasOwnProperty('y')?
Object.prototype.hasOwnProperty.call(x, 'y')damit die Eigenschaft "hasOwnProperty" nicht mit dem Inspektionsprozess in Konflikt steht;)