Vorteil der Verwendung von Object.hasOwnProperty im Vergleich zum Testen, ob eine Eigenschaft nicht definiert ist
Lesezeit: 3 Minuten
Mark Pieszak – Trilon.io
Seit hatEigeneEigenschaft hat einige Vorbehalte und Macken (Fenster / umfangreiche Verwendung in Internet Explorer 8-Problemen usw.):
Gibt es einen Grund, es überhaupt zu verwenden? Wenn einfach getestet wird, ob eine Eigenschaft nicht definiert ist, ist es dann besser gerechtfertigt und einfacher?
Zum Beispiel:
var obj = { a : 'here' };
if (obj.hasOwnProperty('a')) { /* do something */ }
if (obj.a !== undefined) { /* do something */ }
// Or maybe (typeof (obj.a) !== 'undefined')
Ich würde es vorziehen, die Cross-Browser-freundlichste und aktuellste Methodik zu verwenden.
Ich habe auch gesehen, wie dieser Prototyp für hasOwnProperty überschrieben wurde, was funktioniert, aber ich bin nicht von seiner Nützlichkeit überzeugt …
if (!Object.prototype.hasOwnProperty) {
Object.prototype.hasOwnProperty = function(prop) {
var proto = this.__proto__ || this.constructor.prototype;
return (prop in this) && (!(prop in proto) || proto[prop] !== this[prop]);
};
}
Alles andere als verwenden hasOwnProperty garantiert falsch positive oder negative Ergebnisse
– Xotic750
17. Juni 2013 um 15:10 Uhr
Wenn ich weiß, dass ich nach einem Array oder Objekt oder einer Funktion suche, bevorzuge ich es noch einfacher: if (obj.a) . Wenn obj.a null, “”, oder falsch sein kann, ist natürlich ein Vergleich mit !== undefiniert erforderlich. auch dieses Objekt hat ein “a” gemäß (“a” in obj), aber nicht if(obj.a): {a:undefined}
– dandavis
17. Juni 2013 um 15:10 Uhr
Zusätzliche Informationen: Sie könnten diesen jsPerf-Test interessant finden: jsperf.com/hasownproperty-vs-in/2. Endeffekt: .hasOwnProperty ist viel langsamer als jede andere Art, die Existenz von Eigenschaften zu testen (das war überraschend für mich TBH).
– Felix Klinge
17. Juni 2013 um 15:31 Uhr
@FelixKling interessant jsperf. Jedoch .hasOwnProperty und in ganz andere Bedeutung haben. Zitieren Mozilla-Dokumentation: "obj.hasOwnProperty(prop)" used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain.
– Adrien Be
14. Oktober 2014 um 9:02 Uhr
dpineda
hasOwnProperty prüft nicht auf undefinierte Werte. Es prüft nur, ob dem Objekt eine Eigenschaft zugewiesen ist, auch wenn sie undefiniert ist:
Die Methode hasOwnProperty prüft, ob dem Objekt direkt eine Eigenschaft zugewiesen ist.
Wenn also die Eigenschaft ‘a’ im Prototyp vorhanden ist, wird hasOwnProperty diese filtern.
function NewClass() {}
NewClass.prototype = { a: 'there' };
var obj = new NewClass();
if (obj.hasOwnProperty('a')) { /* Code does not work */ }
if (obj.a !== undefined) { /* Code works */ }
Daher ist hasOwnProperty in vielen Fällen sicherer.
Sehr wahr … Das ist mir gerade klar geworden, nachdem ich die Frage gestellt hatte! Es fällt mir schwer, Browserunterstützung für hasOwnProperty zu finden, ist sie mindestens mit IE7+ kompatibel?
– Mark Pieszak – Trilon.io
17. Juni 2013 um 15:15 Uhr
Xotic750
Als weitere Informationen zu der Antwort von Pavel Gruba und dem von Ihnen gelieferten Polyfil:
Nach meinem besten Wissen gibt es keinen guten Weg zum Polyfilieren hasOwnProperty für Browser, die es nicht nativ unterstützen. Ich habe einige verschiedene in freier Wildbahn gesehen und sie alle produzieren falsch positive oder negative Ergebnisse. Wenn ich absolut keine Alternative habe, dann habe ich dies für meinen Gebrauch erstellt, aber es leidet auch unter falsch positiven und negativen Ergebnissen. Entsprechend MSDN.
Unterstützt in den folgenden Dokumentmodi: Quirks, Internet Explorer 6-Standards, Internet Explorer 7-Standards, Internet Explorer 8-Standards, Internet Explorer 9-Standards, Internet Explorer 10-Standards. Wird auch in Windows Store-Apps unterstützt.
JavaScript
function is(x, y) {
if (x === y) {
if (x === 0) {
return 1 / x === 1 / y;
}
return true;
}
var x1 = x,
y1 = y;
return x !== x1 && y !== y1;
}
function hasOwnProperty(object, property) {
var prototype;
return property in object && (!(property in (prototype = object.__proto__ || object.constructor.prototype)) || !is(object[property], prototype[property]));
}
function NewClass() {}
NewClass.prototype = {
a: 'there'
};
var obj = new NewClass();
if (obj.hasOwnProperty("a")) {
console.log("has property")
}
if (hasOwnProperty(obj, "a")) {
console.log("has property")
}
Alles andere als verwenden
hasOwnProperty
garantiert falsch positive oder negative Ergebnisse– Xotic750
17. Juni 2013 um 15:10 Uhr
Wenn ich weiß, dass ich nach einem Array oder Objekt oder einer Funktion suche, bevorzuge ich es noch einfacher: if (obj.a) . Wenn obj.a null, “”, oder falsch sein kann, ist natürlich ein Vergleich mit !== undefiniert erforderlich. auch dieses Objekt hat ein “a” gemäß (“a” in obj), aber nicht if(obj.a): {a:undefined}
– dandavis
17. Juni 2013 um 15:10 Uhr
Zusätzliche Informationen: Sie könnten diesen jsPerf-Test interessant finden: jsperf.com/hasownproperty-vs-in/2. Endeffekt:
.hasOwnProperty
ist viel langsamer als jede andere Art, die Existenz von Eigenschaften zu testen (das war überraschend für mich TBH).– Felix Klinge
17. Juni 2013 um 15:31 Uhr
@FelixKling interessant jsperf. Jedoch
.hasOwnProperty
undin
ganz andere Bedeutung haben. Zitieren Mozilla-Dokumentation:"obj.hasOwnProperty(prop)" used to determine whether an object has the specified property as a direct property of that object; unlike the in operator, this method does not check down the object's prototype chain.
– Adrien Be
14. Oktober 2014 um 9:02 Uhr