167 votes

Comment faire en sorte que console.log affiche l'état actuel d'un objet ?

Dans Safari sans modules complémentaires (et en fait dans la plupart des autres navigateurs), console.log montrera l'objet au dernier état d'exécution, et non pas à l'état où il a été exécuté. console.log a été appelé.

Je dois cloner l'objet juste pour l'éditer via console.log pour obtenir l'état de l'objet à cette ligne.

Ejemplo:

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

2 votes

Jsfiddle exemple du problème et diverses solutions données ci-dessous : jsfiddle.net/luken/M6295

12 votes

Il est extrêmement contre-intuitif pour le journal afin d'obtenir une référence vivante à l'objet. C'est ce qu'on appelle un regarder ce qui est très différent d'une entrée de journal. Cela n'a pas plus de sens de faire cela lors de l'enregistrement d'un objet que lors de l'enregistrement d'une variable stockant une valeur primitive.

3 votes

Comment se fait-il que je n'aie jamais rencontré cela auparavant ? Je trouve cela effrayant

185voto

evan Points 2132

Je pense que vous recherchez console.dir() .

console.log() ne fait pas ce que vous voulez parce qu'elle imprime une référence à l'objet, et au moment où vous l'ouvrez, il a changé. console.dir imprime un répertoire des propriétés de l'objet au moment où vous l'appelez.

L'idée JSON ci-dessous est bonne ; vous pourriez même analyser la chaîne JSON et obtenir un objet consultable comme ce que .dir() vous donnerait :

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

43 votes

Pour moi, dans Chrome13, il n'y a pas de différence entre console.log y console.dir

0 votes

Hm, c'est surprenant - cela fonctionne dans Firebug. Je pensais que c'était la même chose avec Webkit.

1 votes

Ce que je vois dans Chrome, c'est que si vous ouvrez la console après l'exécution de l'instruction log, elle effectuera l'évaluation paresseuse lorsque vous la développerez. Mais si la console est déjà ouverte (par exemple, si vous ouvrez la console et que vous rafraîchissez la page), elle effectuera une évaluation rapide, c'est-à-dire qu'elle imprimera la valeur au moment où l'instruction de journal a été exécutée.

75voto

Alex Turpin Points 17272

Ce que je fais habituellement si je veux voir son état au moment où il a été enregistré, c'est de le convertir en une chaîne JSON.

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

4 votes

Super, c'était un bon indice pour moi : il m'a suffi de l'analyser à nouveau pour avoir mon objet directement dans la console. function odump(o){ console.log($.parseJSON(JSON.stringify(o))); }

1 votes

Merci, ça marche pour moi ! console.dir ne l'a pas imprimé

1 votes

Que se passe-t-il si votre objet contient une structure circulaire ?

32voto

Zach L Points 3560

Vanilla JS :

Réponse de @evan semble être la meilleure solution. Il suffit d'utiliser JSON.parse/stringify pour faire une copie de l'objet.

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

Solution spécifique à JQuery :

Vous pouvez créer un instantané d'un objet à un moment donné à l'aide de la fonction jQuery.extend

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

Ce qui se passe ici, c'est que jQuery crée un nouvel objet avec l'attribut test et l'enregistre (pour qu'il ne change pas).

Solution spécifique AngularJS (1) :

Angular fournit une fonction copy qui peut être utilisée pour le même effet : angular.copy

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

Fonction enveloppante de JS Vanilla :

Voici une fonction qui enveloppe console.log mais fera une copie de tous les objets avant de les déconnecter.

J'ai écrit cette fonction en réponse à quelques fonctions similaires mais moins robustes dans les réponses. Elle prend en charge plusieurs arguments et no essayer de copier des choses qui ne le sont pas régulière objets.

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

exemple d'utilisation : consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})

8voto

Joe Points 34413

Cela > Object dans la console, ne montre pas seulement l'état actuel. Elle reporte en fait la lecture de l'objet et de ses propriétés jusqu'à ce que vous le développiez.

Par exemple,

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

Puis étendre le premier appel, ce sera correct, si vous le faites avant le second console.log retours

-1voto

Dave Points 402

Je risque de me faire tirer dessus pour avoir suggéré cela, mais on peut aller encore plus loin. Nous pouvons directement étendre l'objet console lui-même pour le rendre plus clair.

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

Je ne sais pas si cela provoquera une collision de bibliothèques, une fusion nucléaire ou une rupture du continuum spatio-temporel. Mais cela fonctionne parfaitement dans mes tests qUnit :)

3 votes

Cela n'enregistre rien. Il avale juste le résultat de la stringification de quelque chose. Il est amusant de constater qu'il a reçu des votes positifs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X