it-swarm.it

Come posso modificare il comportamento predefinito di console.log in Safari?

In Safari senza componenti aggiuntivi, console.log mostrerà l'oggetto all'ultimo stato di esecuzione, non allo stato in cui console.log è stato chiamato.

Devo clonare l'oggetto solo per inviarlo tramite console.log per ottenere lo stato dell'oggetto su quella linea.

Esempio:

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

Penso che tu stia cercando console.dir().

console.log() non fa quello che vuoi perché stampa un riferimento all'oggetto, e quando lo apri, è cambiato. console.dir stampa una directory delle proprietà nell'oggetto nel momento in cui viene chiamata.

L'idea JSON di seguito è buona; potresti anche andare ad analizzare la stringa JSON e ottenere un oggetto sfogliabile come quello che .dir () ti darebbe:

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

170
evan

Quello che faccio di solito se voglio vedere lo stato nel momento in cui è stato registrato è solo che lo converto in una stringa JSON.

console.log(JSON.stringify(a));
71
Alex Turpin

Vanilla JS:

@ risposta di evan sembra meglio qui. Solo (ab) usa JSON.parse/stringify per fare in modo efficace una copia dell'oggetto.

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

Soluzione specifica JQuery:

Puoi creare un'istantanea di un oggetto in un determinato momento con jQuery.extend

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

Quello che sta realmente accadendo qui è che jQuery sta creando un nuovo oggetto con il contenuto dell'oggetto test, e loggandolo (quindi non cambierà).

AngularJS (1) soluzione specifica:

Angular fornisce una funzione copy che può essere utilizzata allo stesso effetto: angular.copy

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

Funzione wrapper Vanilla JS:

Ecco una funzione che avvolge console.log ma eseguirà una copia di tutti gli oggetti prima di eseguirne il logout.

Ho scritto questo in risposta ad alcune funzioni simili ma meno robuste nelle risposte. Supporta più argomenti e will not prova a copiare le cose se non sono regular oggetti.

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

example usage: consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})

25
Zach Lysobey

Questo > Object nella console, non mostra solo lo stato corrente. In realtà differisce nel leggere l'oggetto e le sue proprietà fino a quando non lo espandi.

Per esempio,

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

Quindi espandi la prima chiamata, sarà corretta, se lo fai prima che ritorni il secondo console.log

6
Joe

usando il suggerimento di Xeon06, puoi analizzare il suo JSON in un oggetto, ed ecco la funzione di registro che ora uso per scaricare i miei oggetti: 

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

Potresti voler registrare l'oggetto in modo leggibile:

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

Questo fa rientrare l'oggetto con 2 spazi per ogni livello.

Come posso stampare abbastanza JSON usando JavaScript?

1
Andrew

Ho definito un'utilità:

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

e quando voglio accedere alla console, faccio semplicemente:

MyLog("hello console!");

Funziona molto bene!

1
Migio B

C'è un'opzione per usare una libreria di debugger.

https://debugjs.net/

Basta includere lo script nella tua pagina web e inserire le dichiarazioni di registro.

<script src="debug.js"></script>

Registrazione

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

È sufficiente aggiornare la pagina dopo aver aperto la console o aver aperto la console prima di inviare la richiesta alla pagina di destinazione.

0
A. Qaoud

Potrei essere colpito per suggerire questo, ma questo può essere fatto un passo avanti. Possiamo estendere direttamente l'oggetto console stesso per renderlo più chiaro.

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

Non so se questo causerà un qualche tipo di collisione di biblioteca/fusione nucleare/lacerazione nel continuum spaziotemporale. Ma funziona magnificamente nei miei test di QUnit. :)

0
Dave