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);