Como posso alterar o comportamento padrão de console.log no Safari?

No Safari sem complementos, console.log mostrará o object no último estado de execução, não no estado em que console.log foi chamado.

Eu tenho que clonar o object apenas para a saída via console.log para obter o estado do object nessa linha.

Exemplo:

 var test = {a: true} console.log(test); // {a: false} test.a = false; console.log(test); // {a: false} 

   

Eu acho que você está procurando por console.dir() .

console.log() não faz o que você quer porque ele imprime uma referência ao object, e quando você o abre, ele é alterado. console.dir imprime um diretório das propriedades no object no momento em que você o chama.

A ideia do JSON abaixo é boa; você poderia até mesmo analisar a string JSON e obter um object navegável como o que o .dir () lhe daria:

console.log(JSON.parse(JSON.stringify(obj)));

O que eu costumo fazer se eu quiser ver o estado no momento em que foi registrado é apenas convertê-lo em uma string JSON.

 console.log(JSON.stringify(a)); 

Baunilha JS:

@ resposta de evan parece melhor aqui. Apenas (ab) use JSON.parse / stringify para efetivamente fazer uma cópia do object.

 console.log(JSON.parse(JSON.stringify(test))); 

Solução específica JQuery:

Você pode criar um instantâneo de um object em um determinado ponto no tempo com jQuery.extend

 console.log($.extend({}, test)); 

O que está realmente acontecendo aqui é que o jQuery está criando um novo object com o conteúdo do object de test , e registrando isso (assim ele não irá mudar).

Solução específica AngularJS (1):

Angular fornece uma function de copy que pode ser usada para o mesmo efeito: angular.copy

 console.log(angular.copy(test)); 

Função de invólucro do Vanilla JS:

Aqui está uma function que envolve o console.log mas fará uma cópia de todos os objects antes de efetuar o logout deles.

Eu escrevi isso em resposta a algumas funções semelhantes, mas menos robustas nas respostas. Ele suporta vários argumentos e não tentará copiar as coisas se elas não forem objects comuns .

 function consoleLogWithObjectCopy () { var args = [].slice.call(arguments); var argsWithObjectCopies = args.map(copyIfRegularObject) return console.log.apply(console, argsWithObjectCopies) } function copyIfRegularObject (o) { const isRegularObject = typeof o === 'object' && !(o instanceof RegExp) return isRegularObject ? copyObject(o) : o } function copyObject (o) { return JSON.parse(JSON.stringify(o)) } 

exemplo de uso : consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})

That > Object no console, não é apenas mostrando o estado atual. Na verdade, ele está adiando a leitura do object e suas propriedades até você expandi-lo.

Por exemplo,

 var test = {a: true} console.log(test); setTimeout(function () { test.a = false; console.log(test); }, 4000); 

Em seguida, expanda a primeira chamada, ela estará correta, se você fizer isso antes do segundo console.log retornar

Usando a sugestão de Xeon06, você pode analisar seu JSON em um object, e aqui está a function de log que eu agora uso para despejar meus objects:

 function odump(o){ console.log($.parseJSON(JSON.stringify(o))); } 

Eu defini um utilitário:

 function MyLog(text) { console.log(JSON.stringify(text)); } 

e quando eu quero fazer o login no console eu simplesmente faço:

 MyLog("hello console!"); 

Funciona muito bem!

Você pode querer registrar o object de uma maneira legível:

 console.log(JSON.stringify(myObject, null, 2)); 

Isso recua o object com 2 espaços em cada nível.

Como posso imprimir JSON usando JavaScript?

Existe uma opção para usar uma biblioteca de debugging.

https://debugjs.net/

Basta include o script em sua página da web e colocar instruções de log.

  

Exploração madeireira

 var test = {a: true} log(test); // {a: true} test.a = false; log(test); // {a: false} 

Eu posso ser baleado por sugerir isso, mas isso pode ser levado um passo adiante. Podemos estender diretamente o próprio object console para torná-lo mais claro.

 console.logObject = function(o) { (JSON.stringify(o)); } 

Não sei se isso causará algum tipo de colisão de biblioteca / fusão nuclear / rip no continuum espaço-tempo. Mas funciona lindamente nos meus testes qUnit. 🙂

Basta atualizar a página depois de abrir o console ou abrir o console antes de enviar a solicitação para a página de destino ….

Basta imprimir o object inteiro no console.

 console.dir(object);