Erzeugen die folgenden beiden Anweisungen dieselbe Ausgabe? Gibt es einen Grund, einen Weg dem anderen vorzuziehen?
if (key in object)
if (object.hasOwnProperty(key))
javascript
Lorraine Bernard
quelle
quelle
in will also return true if key gets found somewhere in the prototype chain
. Kannst du ein Beispiel schreiben? Vielen Dank.({foo:"bar"}).hasOwnProperty("toString")
vs"toString" in ({foo:"bar"})
Ich werde versuchen, es mit einem anderen Beispiel zu erklären. Angenommen, wir haben das folgende Objekt mit zwei Eigenschaften:
Erstellen wir eine Instanz von TestObj:
Lassen Sie uns die Objektinstanz untersuchen:
Fazit:
Der Operator in gibt immer true zurück, wenn das Objekt direkt oder vom Prototyp aus auf die Eigenschaft zugreifen kann
hasOwnProperty () gibt nur dann true zurück, wenn eine Eigenschaft für die Instanz vorhanden ist, nicht jedoch für ihren Prototyp
Wenn wir logischerweise überprüfen möchten, ob auf dem Prototyp eine Eigenschaft vorhanden ist, würden wir sagen:
Schließlich:
Also, in Bezug auf die Aussage, dass diese beiden Bedingungen ...
... das gleiche Ergebnis erzielen, die Antwort liegt auf der Hand, es kommt darauf an.
quelle
in
prüft auch auf geerbte Eigenschaften, was bei nicht der Fall isthasOwnProperty
.quelle
Zusammenfassend
hasOwnProperty()
sieht es nicht im Prototyp aus, währendin
es im Prototyp aussieht.Entnommen aus O'Reilly High Performance Javascript :
quelle
Du hast einige wirklich gute Antworten bekommen. Ich möchte nur etwas anbieten, das Ihnen die Notwendigkeit erspart, "hasOwnProperty" zu überprüfen, während Sie ein Objekt iterieren.
Wenn Sie ein Objekt erstellen, wird es normalerweise folgendermaßen erstellt:
Wenn Sie nun "someMap" durchlaufen möchten, müssen Sie dies folgendermaßen tun:
Wir tun dies, um zu vermeiden, dass geerbte Eigenschaften wiederholt werden.
Wenn Sie ein einfaches Objekt erstellen möchten, das nur als "Map" (dh Schlüssel-Wert-Paare) verwendet wird, können Sie dies folgendermaßen tun:
Jetzt ist es also sicher, so zu iterieren:
Ich habe diesen tollen Tipp hier gelernt
quelle
(aus Crockfords Javascript: The Good Parts )
quelle
in
Operator unterscheidet sich von derfor-in
Anweisung.in
ist ein Schlüsselwort. OP fragt jedoch nach der spezifischen Verwendung alsin
Bediener. Ihre Antwort befasst sich mit der anderen Verwendung als Teil derfor-in
Erklärung.Die erste Version ist kürzer (insbesondere in verkleinertem Code, in dem die Variablen umbenannt werden).
vs.
Wie @AndreMeinhold sagte, führen sie nicht immer zum gleichen Ergebnis.
quelle