Comment puis-je modifier le comportement par défaut de console.log dans Safari?

Dans Safari sans add-ons, console.log affichera l'objet au dernier état d'exécution, pas à l'état où console.log a appelé console.log .

Je dois cloner l'objet juste pour le sortir via console.log pour obtenir l'état de l'objet sur cette ligne.

Exemple:

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

Je pense que vous recherchez console.dir() .

console.log() ne fait pas ce que vous voulez parce qu'il imprime une référence à l'objet et, au moment où vous le faites apparaître, il est modifié. console.dir imprime un répertoire des propriétés de l'objet au moment où vous l'appelez.

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

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

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

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

Solution spécifique JQuery:

Vous pouvez créer un instantané d'un objet à un certain moment avec jQuery.extend

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

Ce qui se passe réellement ici, jQuery crée un nouvel objet avec le contenu de l'objet de test et enregistre-le (donc il ne changera pas).

Solution spécifique angulaire:

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

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

Vanilla JS:

La réponse de @ evan semble mieux ici. Juste (ab) utilisez JSON.parse / stringify pour effectivement faire une copie de l'objet.

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

Fonction Vanner JS wrapper:

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

J'ai écrit ceci en réponse à quelques fonctions similaires mais moins robustes dans les réponses. Il prend en charge plusieurs arguments et n'essaiera pas de copier les choses si elles ne sont pas des objets réguliers .

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

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

Cet > Object dans la console, affiche non seulement l'état actuel. En fait, il est différé de lire l'objet et ses propriétés jusqu'à ce que vous l'étendiez.

Par exemple,

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

Ensuite, développez le premier appel, il sera correct, si vous le faites avant la deuxième console.log retourne

En utilisant l'indice de Xeon06, vous pouvez analyser son JSON dans un objet, et voici la fonction de journal que j'utilise maintenant pour décharger mes objets:

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

J'ai défini un utilitaire:

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

Et quand je veux me connecter à la console, je fais simplement:

 MyLog("hello console!"); 

Il fonctionne très bien!

Vous voudrez peut-être enregistrer l'objet de manière lisible par l'homme:

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

Cela efface l'objet avec 2 espaces à chaque niveau.

Comment puis-je imprimer JSON avec JavaScript?

Je peux être abattu pour avoir suggéré cela, mais cela peut être franchi un peu plus loin. Nous pouvons étendre directement l'objet de console pour le rendre plus clair.

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

Je ne sais pas si cela causera un certain type de collision de la bibliothèque / fusion nucléaire / déchirure dans le continuum spatio-temporelle. Mais ça fonctionne très bien dans mes tests qUnit. 🙂

Il suffit de rafraîchir la page après avoir ouvert la console ou d'ouvrir la console avant de soumettre la demande à la page ciblée ….

Il existe une option pour utiliser une bibliothèque de débogueurs.

https://debugjs.net/

Il suffit d'inclure le script dans votre page Web et de mettre des déclarations de journal.

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

Enregistrement

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

Imprimez tout l'objet entier sur la console.

 console.dir(object);