Vou começar com o código:
var s = ["hi"];
console.log(s);
s[0] = "bye";
console.log(s);
Simples, certo? Em resposta a isso, o Firebug diz:
["hi"]
["bye"]
Maravilhoso, mas o console JavaScript do Chrome (7.0.517.41 beta) diz:
["bye"]
["bye"]
Fiz algo errado ou o console JavaScript do Chrome é excepcionalmente preguiçoso ao avaliar minha matriz?
javascript
arrays
logging
google-chrome
console
Eric Mickelsen
fonte
fonte
i
dica do ícone azul diz "O valor abaixo foi avaliado agora".Respostas:
Obrigado pelo comentário, tec. Consegui encontrar um bug do Webkit não confirmado existente que explica esse problema: https://bugs.webkit.org/show_bug.cgi?id=35801 (EDIT: agora corrigido!)
Parece haver algum debate sobre o quanto de um bug é e se é corrigível. Parece um mau comportamento para mim. Foi especialmente preocupante para mim porque, pelo menos no Chrome, ocorre quando o código reside em scripts executados imediatamente (antes do carregamento da página), mesmo quando o console é aberto, sempre que a página é atualizada. Chamar console.log quando o console ainda não está ativo resulta apenas em uma referência ao objeto na fila, não na saída que o console conterá. Portanto, a matriz (ou qualquer objeto) não será avaliada até que o console esteja pronto. É realmente um caso de avaliação preguiçosa.
No entanto, existe uma maneira simples de evitar isso em seu código:
Ao chamar toString, você cria uma representação na memória que não será alterada pelas instruções a seguir, que o console lerá quando estiver pronto. A saída do console é um pouco diferente de passar o objeto diretamente, mas parece aceitável:
fonte
Pela explicação de Eric, é devido à
console.log()
fila e imprime um valor posterior da matriz (ou objeto).Pode haver 5 soluções:
fonte
Você pode clonar uma matriz com
Array#slice
:Uma função que você pode usar em vez de
console.log
não ter esse problema é a seguinte:Infelizmente, para o caso de objetos, o melhor método parece ser depurar primeiro com um navegador que não seja o WebKit ou escrever uma função complicada para clonar. Se você estiver trabalhando apenas com objetos simples, onde a ordem das chaves não importa e não há funções, você sempre pode:
Todos esses métodos são obviamente muito lentos; portanto, mais do que com os
console.log
s normais , você precisa removê-los depois de concluir a depuração.fonte
Isso foi corrigido no Webkit, no entanto, ao usar a estrutura React, isso acontece comigo em algumas circunstâncias, se você tiver esses problemas, use o que outros sugerem:
fonte
JSON.parse(JSON.stringify(event))
não obtém a profundidade / precisão corretas. As instruções do depurador são a única solução real que encontrei para obter o insight correto.Isso já foi respondido, mas deixarei minha resposta de qualquer maneira. Eu implementei um wrapper de console simples que não sofre com esse problema. Requer jQuery.
Ele implementa apenas
log
,warn
eerror
métodos, você precisará adicionar um pouco mais para que seja intercambiável com um regularconsole
.fonte
Parece que o Chrome está substituindo na fase "pré-compilação" qualquer instância de "s" por ponteiro para a matriz real.
Uma maneira de contornar é clonar a matriz, registrando uma nova cópia:
fonte
a solução mais curta até agora é usar a sintaxe de dispersão de matriz ou objeto para obter um clone de valores a serem preservados como no momento do registro, ou seja:
no entanto, seja avisado como faz uma cópia superficial, para que quaisquer valores não primitivos aninhados profundos não sejam clonados e mostrados em seu estado modificado no console
fonte