Ao iterar as propriedades de um objeto, é seguro excluí-las durante um loop for-in?
Por exemplo:
for (var key in obj) {
if (!obj.hasOwnProperty(key)) continue;
if (shouldDelete(obj[key])) {
delete obj[key];
}
}
Em muitas outras linguagens, iterar em um array ou dicionário e deletar dentro dele não é seguro. Tudo bem em JS?
(Estou usando o tempo de execução Spidermonkey do Mozilla.)
javascript
loops
object
properties
Joe Shaw
fonte
fonte
Respostas:
O padrão ECMAScript 5.1 seção 12.6.4 (em loops for-in) diz:
Portanto, acho que está claro que o código do OP é legal e funcionará conforme o esperado. As peculiaridades do navegador afetam a ordem de iteração e as instruções de exclusão em geral, mas não afetam se o código OPs funcionará. Geralmente, é melhor excluir apenas a propriedade atual na iteração - excluir outras propriedades no objeto fará com que sejam incluídas (se já visitadas) ou não incluídas na iteração, embora isso possa ou não ser uma preocupação, dependendo do situação.
Veja também:
Porém, nada disso realmente afeta o código do OP.
fonte
A partir da especificação Javascript / ECMAScript (especificamente 12.6.4 A declaração for-in ):
fonte