Jak Mogę zmienić domyślne zachowanie konsoli.Zaloguj się Safari?

W Safari bez dodatków, console.log wyświetli obiekt w ostatnim stanie wykonania, a nie w stanie, w którym wywołano console.log.

Muszę sklonować obiekt tylko po to, aby wyprowadzić go przez console.log, Aby uzyskać stan obiektu w tej linii.

Przykład:

var test = {a: true}
console.log(test); // {a: false}
test.a = false; 
console.log(test); // {a: false}
Author: Michael Myers, 2011-09-12

11 answers

Myślę, że szukasz console.dir().

console.log() nie robi tego, co chcesz, ponieważ drukuje odniesienie do obiektu, a gdy go otworzysz, zmienia się. console.dir wypisuje katalog właściwości obiektu w momencie jego wywołania.

Poniższy pomysł JSON jest dobry; możesz nawet przejść do analizy ciągu JSON i uzyskać obiekt do przeglądania, taki jak Jaki.dir () daje:

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

 169
Author: evan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-07 22:01:36

To, co zwykle robię, jeśli chcę zobaczyć jego stan w czasie, gdy był rejestrowany, to po prostu konwertuję go na ciąg JSON.

console.log(JSON.stringify(a));
 70
Author: Alex Turpin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-12 14:10:54

Vanilla JS:

@odpowiedź Evana wydaje się tutaj najlepsza. Po prostu (ab)użyj JSON.parse / stringify, aby skutecznie wykonać kopię obiektu.

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

JQuery specyficzne rozwiązanie:

Można utworzyć migawkę obiektu w określonym momencie za pomocą jQuery.extend

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

To, co się tutaj dzieje, to jQuery tworzy nowy obiekt z zawartością obiektu test i zapisuje to (aby nie uległo zmianie).

AngularJS (1) rozwiązanie:

Angular zapewnia copy funkcję, która może być używana do tego samego efektu: angular.copy

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

Vanilla js wrapper funkcja:

Oto funkcja, która zawija console.log, ale zrobi kopię obiektów przed ich wylogowaniem.

Napisałem to w odpowiedzi na kilka podobnych, ale mniej solidnych funkcji w odpowiedziach. Obsługuje wiele argumentów i będzie nie próbować kopiować rzeczy, jeśli nie są one regularnymi obiektów.

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

Przykładowe użycie: consoleLogWithObjectCopy('obj', {foo: 'bar'}, 1, /abc/, {a: 1})

 24
Author: Zach Lysobey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-21 14:10:16

To > Object w konsoli, nie tylko pokazuje aktualny stan. W rzeczywistości odkłada odczyt obiektu i jego właściwości, dopóki go nie rozszerzysz.

Na przykład,

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

Następnie rozwiń pierwsze wywołanie, będzie poprawne, jeśli zrobisz to przed drugim console.log zwróci

 6
Author: Joe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-12 14:08:27

Używając podpowiedzi Xeon06, możesz parsować jego JSON w obiekcie, A oto funkcja dziennika, której teraz używam do zrzucania moich obiektów:

function odump(o){
   console.log($.parseJSON(JSON.stringify(o)));
}
 2
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-29 19:41:41

Zdefiniowałem użyteczność:

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

A jak chcę się zalogować na konsolę to po prostu robię:

MyLog("hello console!");
To działa bardzo dobrze!
 1
Author: Migio B,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-02 22:04:34

Możesz chcieć zalogować obiekt w sposób czytelny dla człowieka:

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

To wcięło obiekt z 2 spacjami na każdym poziomie.

Jak wydrukować JSON za pomocą JavaScript?

 1
Author: Andrew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:14

Istnieje możliwość użycia biblioteki debuggera.

Https://debugjs.net/

Wystarczy umieścić skrypt na swojej stronie internetowej i umieścić instrukcje dziennika.

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

Logowanie

var test = {a: true}
log(test); // {a: true}
test.a = false; 
log(test); // {a: false}
 1
Author: Takashi Harano,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 15:25:52

Mogę zostać postrzelony za sugerowanie tego, ale to można zrobić krok dalej. Możemy bezpośrednio rozszerzyć sam obiekt konsoli, aby uczynić go bardziej przejrzystym.

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

Nie wiem, czy spowoduje to jakiś rodzaj kolizji/rozpadu nuklearnego/rip w kontinuum czasoprzestrzeni. Ale to działa pięknie w moich testach qUnit. :)

 0
Author: Dave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-21 21:31:37

Po prostu odśwież stronę po otwarciu konsoli lub otwórz konsolę przed wysłaniem żądania na stronę docelową....

 0
Author: A. Qaoud,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-15 10:42:17

Po prostu wydrukuj cały obiekt na konsoli.

console.dir(object);
 -1
Author: Mangesh Bhapkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-06 10:53:37