Zostałem skierowany na stronę for..in w MDN, kiedy napisano: „for..in Iteruje po wyliczalnych właściwościach obiektu”.
Następnie przeszedłem do strony Wyliczalność i własność właściwości, na której było napisane: „Wyliczalne właściwości to te, które mogą być iterowane przez pętlę for..in”.
Słownik definiuje wyliczalne jako policzalne, ale tak naprawdę nie mogę sobie wyobrazić, co to oznacza. Czy mogę dostać przykład czegoś, co jest wyliczalne?
javascript
enumerable
Patrick
źródło
źródło
for-in
robi?for in
pętlę, czy nie (dla tych, którzy nie chcą znać szczegółów lub po prostu nie dbają;))Odpowiedzi:
Wyliczalna właściwość to taka, która może być uwzględniona i odwiedzana podczas
for..in
pętli (lub podobnej iteracji właściwości, jak npObject.keys()
.).Jeśli właściwość nie zostanie zidentyfikowana jako wyliczalna, pętla zignoruje, że znajduje się w obiekcie.
Właściwość jest identyfikowana jako wyliczalna lub nie na podstawie własnego
[[Enumerable]]
atrybutu . Możesz to zobaczyć jako część deskryptora właściwości :Następnie
for..in
pętla wykonuje iterację po nazwach właściwości obiektu.Ale ocenia swoją instrukcję -
console.log(prop);
w tym przypadku - tylko dla tych właściwości, których[[Enumerable]]
atrybutem jesttrue
.Ten warunek istnieje, ponieważ obiekty mają o wiele więcej właściwości , zwłaszcza z dziedziczenia :
Każda z tych właściwości nadal istnieje na obiekcie :
Ale są pomijane przez
for..in
pętlę, ponieważ nie są wyliczalne.źródło
But, they are skipped (or not counted) by the for..in loop because they are not enumerable
. Właściwości włączoneObject.prototype
są w rzeczywistości ignorowane, ponieważ znajdują się dalej w łańcuchu prototypów, a nie dlatego, że nie można ich wyliczyć. AnigetOwnPropertyNames()
lubkeys()
wykazują właściwości, które nie są przedmiotem rękę. Na marginesie, prawdą jest, że wielu wbudowanych właściwości nie jest wyliczalnych i dlatego nie będą one wyświetlane zkeys()
, ale będziesz musiał napisać dodatkowy kod, jeśli chcesz przejść przez łańcuch prototypów.Jeśli utworzysz obiekt za pośrednictwem
myObj = {foo: 'bar'}
lub czegoś w pobliżu, wszystkie właściwości są wyliczalne. Więc łatwiejszym pytaniem jest to, czego nie da się wyliczyć? Niektóre obiekty mają pewne niewliczalne właściwości, na przykład jeśli wywołaszObject.getOwnPropertyNames([])
(które zwraca tablicę wszystkich właściwości, wyliczalnych lub nie, na []), zwróci['length']
, co zawiera niewliczalną właściwość tablicy, „length” .Możesz tworzyć własne niewliczalne właściwości, wywołując
Object.defineProperty
:Ten przykład w znacznym stopniu zapożycza z niewliczalnych właściwości w JavaScript , ale pokazuje wyliczany obiekt. Właściwości mogą być zapisywalne lub nie, konfigurowalne lub wyliczalne. John Resig omawia to w ramach ECMAScript 5 Objects and Properties .
Jest też pytanie o przepełnienie stosu, dlaczego kiedykolwiek chciałbyś, aby właściwości były niewymierne .
źródło
To o wiele bardziej nudne niż coś, co powinno być wizualizowane.
We wszystkich właściwościach istnieje dosłownie atrybut zwany „wyliczalnym”. Gdy ma wartość false,
for..in
metoda pominie tę właściwość, udając, że nie istnieje.Istnieje wiele właściwości obiektów, które mają ustawioną wartość „enumerable” na false, np. „ValueOf” i „hasOwnProperty”, ponieważ zakłada się, że nie chcesz, aby silnik JavaScript wykonywał iteracje po nich.
Możesz tworzyć własne niewliczalne właściwości przy użyciu
Object.defineProperty
metody:Teraz fakt, że jest nawet sekret dotyczący samochodu, jest ukryty. Oczywiście nadal mogą uzyskać bezpośredni dostęp do nieruchomości i uzyskać odpowiedź:
Ale musieliby wiedzieć, że własność istnieje jako pierwsza, ponieważ jeśli próbują uzyskać do niej dostęp,
for..in
lubObject.keys
pozostanie ona całkowicie tajna:Powinni po prostu nazwać to „forInAble”.
źródło
Jeśli masz trudności z wyobrażeniem sobie, „co to znaczy być policzalnym?” dlaczego nie zadać sobie pytania, co to znaczy być niepoliczalnym ?
Myślę o tym trochę w ten sposób, istnieje niezliczona właściwość , która jest częściowo ukryta ; co oznacza, że niepoliczalne jest dziwne. Teraz możesz wyobrazić sobie wyliczenie jako to, co pozostało - tym bardziej naturalną właściwość, z którą się spotykamy, odkąd odkryliśmy Obiekty . Rozważać
Teraz w a
for..in
, wyobraź sobie to jak pseudokodgdzie ciało pętli wpisanej w JavaScript jest w miejscu
/* whatever */
źródło
Napiszę jedną definicję linii ENUMERABLE
Enumerable
: Określa, czy właściwość może zostać zwrócona w pętli for / in.źródło
metody nie są wyliczalne; a raczej metody wbudowane nie są… po wyszukaniu tego, co wyliczalne dla skryptu java; odnosi się tylko do atrybutu własności .. wszystkie utworzone obiekty w ecma3 są wyliczalne, a ecma5 u może teraz je zdefiniować… to wszystko…: D lol trochę mi zajęło znalezienie odpowiedzi; ale wierzę, że jest to omówione w książce Davida Flanagana .. więc myślę, że oznacza to „ukryte” lub „ukryte”, ponieważ metody nie są pokazywane w pętli for in, a zatem są „ukryte”
źródło
Pomyśl o wyliczonym typie danych, tylko o strukturze obiektów, które odpowiadają różnym liczbom. Zadeklarowanie czegoś jako wyliczalnego oznacza zadeklarowanie, że odpowiada on określonej liczbie, pozwalając na nadanie jej miejsca w słowniku, który reprezentuje policzalne składniki obiektu. Mówiąc prościej, uczynienie obiektu wyliczalnym jest tym samym, co powiedzenie kompilatorowi: „Hej, ta właściwość się liczy, chcę to zobaczyć, kiedy sprawdzę dane dotyczące tego obiektu”.
źródło
Wbudowane metody dziedziczone przez obiekty nie są wyliczalne, ale właściwości, które kod dodaje do obiektów, są wyliczalne, chyba że zostanie to wyraźnie określone
źródło