Czy pętla „for… in” w Javascript przechodzi przez tabele / elementy hasht w kolejności, w jakiej zostały zadeklarowane? Czy istnieje przeglądarka, która nie robi tego w kolejności?
Obiekt, którego chcę użyć, zostanie zadeklarowany raz i nigdy nie będzie modyfikowany.
Załóżmy, że mam:
var myObject = { A: "Hello", B: "World" };
I używam ich dalej w:
for (var item in myObject) alert(item + " : " + myObject[item]);
Czy mogę się spodziewać, że „A:„ Cześć ”” zawsze będzie występować przed „B:„ Świat ”” w większości porządnych przeglądarek?
javascript
for-loop
czakryt
źródło
źródło
Odpowiedzi:
Cytując Johna Resiga :
Wszystkie przeglądarki przestrzegają kolejności definicji, z wyjątkiem Chrome i Opery, które działają dla każdej nieliczbowej nazwy właściwości. W tych dwóch przeglądarkach właściwości są wyciągane w kolejności przed pierwszą właściwością nienumeryczną (ma to związek z tym, jak implementują tablice). Kolejność jest również taka sama
Object.keys
.Ten przykład powinien wyjaśnić, co się dzieje:
Techniczne tego są mniej ważne niż fakt, że może się to zmienić w dowolnym momencie. Nie polegaj na rzeczach pozostających w ten sposób.
W skrócie: użyj tablicy, jeśli kolejność jest dla Ciebie ważna.
źródło
Wpadłem na to rok później ...
Jest rok 2012, a główne przeglądarki wciąż się różnią:
Gist lub test w bieżącej przeglądarce
Safari 5, Firefox 14
Chrome 21, Opera 12, Node 0.6, Firefox 27
IE9
źródło
delete
jest interesujące, ponieważ przynajmniej w wersji V8 natychmiast powoduje utworzenie kopii zapasowej obiektu przez tablicę skrótów. Jednak tabela skrótów w V8 przechowuje w kolejności wstawiania. Najciekawszym rezultatem jest IE, zastanawiam się, jaką brzydotę robią, aby to wyciągnąć ...Ze specyfikacji języka ECMAScript , sekcja 12.6.4 (w
for .. in
pętli):I sekcja 4.3.3 (definicja „obiektu”):
Myślę, że to oznacza, że nie można polegać na właściwościach wyliczanych w spójnej kolejności we wszystkich implementacjach JavaScript. (W każdym razie oparcie się na szczegółach języka dotyczących konkretnej implementacji byłoby kiepskie).
Jeśli chcesz zdefiniować swoje zamówienie, musisz zaimplementować coś, co je definiuje, na przykład szereg kluczy, które sortujesz przed uzyskaniem dostępu do obiektu.
źródło
Elementy obiektu, które dla / w wyliczają są właściwościami, które nie mają ustawionej flagi DontEnum. Standard ECMAScript, czyli Javascript, wyraźnie stwierdza, że „Obiekt jest nieuporządkowanym zbiorem właściwości” (patrz http://www.mozilla.org/js/language/E262-3.pdf sekcja 8.6).
Zakładanie, że wszystkie implementacje JavaScript będą wyliczane w kolejności deklaracji, nie będzie zgodne ze standardami (tj. Bezpieczne).
źródło
Kolejność iteracji jest również mylona w odniesieniu do usuwania właściwości, ale w tym przypadku tylko z IE.
Pragnienie zmiany specyfikacji w celu ustalenia kolejności iteracji wydaje się dość popularne wśród programistów, jeśli dyskusja na stronie http://code.google.com/p/v8/issues/detail?id=164 jest jakąkolwiek wskazówką.
źródło
w IE6 kolejność nie jest gwarantowana.
źródło
Zamówienie nie może być zaufane. Zarówno Opera, jak i Chrome zwracają listę właściwości nieuporządkowanych.
Powyższy kod pokazuje B, A, C w Operze i C, A, B w Chrome.
źródło
Nie odpowiada to samo w sobie na pytanie, ale oferuje rozwiązanie podstawowego problemu.
Zakładając, że nie możesz polegać na kolejności zachowania, dlaczego nie użyć tablicy obiektów z kluczem i wartością jako właściwości?
Teraz do Ciebie należy upewnienie się, że klucze są unikalne (przy założeniu, że jest to również ważne dla Ciebie. Również bezpośrednie adresowanie zmian i dla (... w ...) teraz zwraca indeksy jako „klucze”.
Zobacz pióro do adresowania (... w ...) w kolejności według JDQ ( @JDQ ) na CodePen .źródło