Jaka jest różnica między Object.getOwnPropertyNames
i Object.keys
w javascript? Docenione zostaną również niektóre przykłady.
javascript
kamilkp
źródło
źródło
Object.keys()
nie zwraca ich, aObject.getOwnPropertyNames()
robi to.Odpowiedzi:
Jest mała różnica.
Object.getOwnPropertyNames(a)
zwraca wszystkie własne właściwości obiektua
.Object.keys(a)
zwraca wszystkie wyliczalne własne właściwości. Oznacza to, że jeśli zdefiniujesz właściwości obiektu bez robienia niektórych z nich,enumerable: false
te dwie metody dadzą ci ten sam rezultat.Łatwo jest przetestować:
Jeśli zdefiniujesz właściwość bez podania deskryptora atrybutów właściwości (co oznacza, że nie używasz
Object.defineProperties
), na przykład:wtedy taka właściwość staje się automatycznie wyliczalna i obie metody tworzą tę samą tablicę.
źródło
length
właściwości obiektów tablicowych nie są wyliczalne, więc nie pojawiają się wObject.keys
.length
Właściwość obiektów znajduje się na prototypie, a nie na samym obiekcie, więc ani goObject.keys
nie wymienimyObject.getOwnPropertyNames
.Object.getOwnPropertyNames(anyArray)
obejmujelength
Object.getOwnPropertyNames(anyArray)
rzeczywiście zawieralength
w zwróconej tablicy!Inna różnica polega na tym, że
Object.getOwnPropertyNames
metoda tablicowa zwróci dodatkową właściwość, którą jestlength
.źródło
Notacja dosłowna a konstruktor podczas tworzenia obiektu. Oto coś, co mnie dopadło.
Więc w moim przypadku
foo
funkcja nie działała, jeśli dałem jej obiekty typu cat2.Istnieją inne sposoby tworzenia obiektów, więc mogą być też inne zagięcia.
źródło
Object.getOwnPropertyNames
zwróci nazwy właściwości dlacat1
i niecat2
. Dwa sposoby tworzenia obiektu nie powodują różnicy międzyObject.getOwnPropertyNames
iObject.keys
.Jak już wyjaśniono,
.keys
nie zwraca właściwości policzalnych.Jeśli chodzi o przykłady, jednym z przypadków pułapek jest
Error
obiekt: niektóre jego właściwości są policzalne.Tak więc, podczas gdy
console.log(Object.keys(new Error('some msg')))
plony[]
,console.log(Object.getOwnPropertyNames(new Error('some msg')))
plony["stack", "message"]
źródło
Kolejna różnica polega na tym, że (przynajmniej z nodejs) funkcja „getOwnPropertyNames” nie gwarantuje kolejności kluczy, dlatego zwykle używam funkcji „klucze”:
źródło
getOwnPropertyNames
braku porządku? Ponieważ ES2015 określa zamówienie naObect.getOwnPropertyNames
, podczas gdy zamówienie naObect.keys
wciąż zależy od implementacji.for-in loop
,Object.keys
, iObject.getOwnPropertyNames
. To powiedziawszy, wszystkie trzy wyliczą w spójnej kolejności względem siebie.