Was ist der Unterschied zwischen Object.getOwnPropertyNames
und Object.keys
in Javascript? Auch einige Beispiele wären willkommen.
javascript
kamilkp
quelle
quelle
Object.keys()
Gibt sie nicht zurück, während dies derObject.getOwnPropertyNames()
Fall ist.Antworten:
Es gibt einen kleinen Unterschied.
Object.getOwnPropertyNames(a)
Gibt alle eigenen Eigenschaften des Objekts zurücka
.Object.keys(a)
gibt alle aufzählbaren zurück eigenen Eigenschaften zurück. Wenn Sie Ihre Objekteigenschaften definieren, ohne einige davonenumerable: false
zu erstellen, erhalten Sie mit diesen beiden Methoden das gleiche Ergebnis.Es ist einfach zu testen:
Wenn Sie eine Eigenschaft definieren, ohne einen Eigenschaftsattributdeskriptor anzugeben (dh, Sie verwenden ihn nicht
Object.defineProperties
), zum Beispiel:dann wird eine solche Eigenschaft automatisch zu einer Aufzählung und beide Methoden erzeugen dasselbe Array.
quelle
length
Eigenschaften von Array-Objekten nicht aufzählbar, sodass sie nicht in angezeigt werdenObject.keys
.length
Eigenschaft von Objekten auf dem Prototyp ist, nicht das Objekt selbst, also wederObject.keys
nochObject.getOwnPropertyNames
wird sie aufzulisten.Object.getOwnPropertyNames(anyArray)
enthältlength
Object.getOwnPropertyNames(anyArray)
in der Tatlength
in das zurückgegebene Array enthalten!Ein weiterer Unterschied besteht darin, dass im Falle einer Array-
Object.getOwnPropertyNames
Methode eine zusätzliche Eigenschaft zurückgegeben wirdlength
.quelle
Literale Notation gegen Konstruktor beim Erstellen eines Objekts. Hier ist etwas, das mich erwischt hat.
In meinem Fall
foo
funktionierte die Funktion also nicht, wenn ich ihr Objekte vom Typ cat2 gab.Es gibt andere Möglichkeiten, Objekte zu erstellen, sodass auch andere Knicke auftreten können.
quelle
Object.getOwnPropertyNames
gibt die Eigenschaftsnamen fürcat1
und nicht zurückcat2
. Die beiden Arten, das Objekt zu erstellen, erzeugen keinen Unterschied zwischenObject.getOwnPropertyNames
undObject.keys
.Gibt,
.keys
wie bereits erläutert, keine aufzählbaren Eigenschaften zurück.In Bezug auf Beispiele ist einer der Fallstricke ein
Error
Objekt: Einige seiner Eigenschaften sind aufzählbar.Also, während
console.log(Object.keys(new Error('some msg')))
Renditen[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
Renditen["stack", "message"]
quelle
Ein weiterer Unterschied ist, dass (zumindest bei nodejs) die Funktion "getOwnPropertyNames" keine Schlüsselreihenfolge garantiert. Deshalb verwende ich normalerweise die Funktion "keys":
quelle
getOwnPropertyNames
nicht in Ordnung sind? Weil ES2015 eine Bestellung fürObect.getOwnPropertyNames
angibt , während die Bestellung fürObect.keys
noch der Implementierung überlassen ist.for-in loop
,Object.keys
, undObject.getOwnPropertyNames
. Das heißt, alle drei werden in einer konsistenten Reihenfolge zueinander aufzählen.