O loop "for ... in" no Javascript passa pelas hashtables / elementos na ordem em que são declarados? Existe um navegador que não faça isso em ordem?
O objeto que desejo usar será declarado uma vez e nunca será modificado.
Suponha que eu tenha:
var myObject = { A: "Hello", B: "World" };
E eu ainda os uso em:
for (var item in myObject) alert(item + " : " + myObject[item]);
Posso esperar 'A: "Olá"' sempre antes de 'B: "Mundo"' na maioria dos navegadores decentes?
javascript
for-loop
chakrit
fonte
fonte
Respostas:
Citando John Resig :
Todos os navegadores respeitam a ordem de definição, com exceção do Chrome e Opera, o que ocorre com todos os nomes de propriedades não numéricos. Nesses dois navegadores, as propriedades são colocadas em ordem antes da primeira propriedade não numérica (isso tem a ver com a maneira como eles implementam matrizes). O pedido também é o mesmo
Object.keys
.Este exemplo deve deixar claro o que acontece:
Os detalhes técnicos disso são menos importantes do que o fato de que isso pode mudar a qualquer momento. Não confie nas coisas que ficam assim.
Resumindo: use uma matriz se a ordem for importante para você.
fonte
Colidindo com isso um ano depois ...
É 2012 e os principais navegadores ainda diferem:
essência ou teste no navegador atual
Safari 5, Firefox 14
Chrome 21, Opera 12, nó 0.6, Firefox 27
IE9
fonte
delete
é interessante porque, pelo menos na V8, faz com que o objeto seja copiado instantaneamente por uma tabela de hash. No entanto, a tabela de hash na V8 armazena em ordem de inserção. A maioria resultado interessante aqui é IE, gostaria de saber que tipo de feiúra que fazer para fazer aquilo ...Na especificação de idioma ECMAScript , seção 12.6.4 (no
for .. in
loop):E seção 4.3.3 (definição de "Objeto"):
Acho que isso significa que você não pode confiar nas propriedades que estão sendo enumeradas em uma ordem consistente nas implementações de JavaScript. (Seria um estilo ruim, de qualquer maneira, contar com detalhes específicos da implementação de uma linguagem.)
Se você deseja que seu pedido seja definido, será necessário implementar algo que o defina, como uma matriz de chaves que você classifica antes de acessar o objeto com ele.
fonte
Os elementos de um objeto que enumera / são as propriedades que não possuem o sinalizador DontEnum definido. O padrão ECMAScript, também conhecido como Javascript, diz explicitamente que "Um Objeto é uma coleção não ordenada de propriedades" (consulte http://www.mozilla.org/js/language/E262-3.pdf, seção 8.6).
Não será compatível com os padrões (ou seja, seguro) assumir que todas as implementações de Javascript serão enumeradas em ordem de declaração.
fonte
A ordem de iteração também é confundida com relação à exclusão de propriedades, mas neste caso apenas com o IE.
O desejo de alterar as especificações para corrigir a ordem da iteração parece ser um desejo bastante popular entre os desenvolvedores se a discussão em http://code.google.com/p/v8/issues/detail?id=164 for alguma indicação.
fonte
no IE6, o pedido não é garantido.
fonte
O pedido não pode ser confiável. O Opera e o Chrome retornam a lista de propriedades sem ordem.
O código acima mostra B, A, C no Opera e C, A, B no Chrome.
fonte
Isso não responde à pergunta em si, mas oferece uma solução para o problema básico.
Supondo que você não possa confiar na ordem de preservação, por que não usar uma matriz de objetos com chave e valor como propriedades?
Agora, cabe a você garantir que as chaves sejam únicas (supondo que isso também seja importante para você. Além disso, as alterações de endereçamento direto e para (... em ...) agora retornam índices como 'chaves'.
Consulte a caneta para (... em ...) endereçar em ordem por JDQ ( @JDQ ) no CodePen .fonte