Zrzut obiektu JavaScript


89

Czy istnieje dodatek / aplikacja innej firmy lub jakiś sposób na wykonanie zrzutu mapy obiektów w debugerze skryptów dla obiektu JavaScript?

Oto sytuacja ... Mam metodę wywoływaną dwukrotnie i za każdym razem coś jest inne. Nie jestem pewien, co się zmieniło, ale coś jest. Tak więc, gdybym mógł zrzucić wszystkie właściwości window (lub przynajmniej window.document) do edytora tekstu, mógłbym porównać stan między dwoma wywołaniami z prostym plikiem diff. Myśli?


Odpowiedzi:


61

Firebug +console.log(myObjectInstance)


4
... a następnie zajrzyj do konsoli Firebug, a nie do standardowej konsoli Javascript . :-)
towi

3
IE ma konsolę, ale rejestrowanie obiektu zwraca [object Object]. Niezbyt przydatne
Steve Robbins,

6
@SteveRobbins, kto obecnie używa IE do tworzenia aplikacji internetowych? Osobiście jedynym zastosowaniem, jakie do tej pory znalazłem, jest pobranie prawdziwej przeglądarki internetowej po ponownym zainstalowaniu systemu operacyjnego Windows. Nawiasem mówiąc, to jedyny raz, kiedy uruchamiam ten pokój oprogramowania.
Darin Dimitrov,

8
Każdy programista obsługujący główne przeglądarki. Jeśli problem występuje tylko w IE, można go przetestować tylko w IE, więc musisz skorzystać z przeglądarki.
Steve Robbins

2
A jeśli używasz node.js i terminala… Nie ma firebuga?
Cheruvim

136
console.log("my object: %o", myObj)

W przeciwnym razie otrzymasz reprezentację ciągu czasami wyświetlającą:

[object Object]

lub takie.


3
po prostu drukuje [obiekt obiektu] dla Chrome i Firefox. <wzruszenie ramion>
slashdottir

1
@slashdottir To absolutnie działa w Chrome i FF. Używam go w Chrome przynajmniej raz w tygodniu, a sporadycznie w FF.
Tim

1
@Tim: masz rację, to działa. proszę mi wybaczyć. user err
slashdottir

Jak do licha to nie jest wybrana odpowiedź? Mam szczęście, że otrzymałem tę odpowiedź w moje urodziny 4 lata temu, kiedy nie używałem js.
Joey Carson

2
W Meteor (po stronie serwera) drukuje my object: %o. Niezbyt pomocne :)
Erdal G.

45
function mydump(arr,level) {
    var dumped_text = "";
    if(!level) level = 0;

    var level_padding = "";
    for(var j=0;j<level+1;j++) level_padding += "    ";

    if(typeof(arr) == 'object') {  
        for(var item in arr) {
            var value = arr[item];

            if(typeof(value) == 'object') { 
                dumped_text += level_padding + "'" + item + "' ...\n";
                dumped_text += mydump(value,level+1);
            } else {
                dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
            }
        }
    } else { 
        dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
    }
    return dumped_text;
}

4
Zaktualizuj swój kod, zmieniając nazwę funkcji, ponieważ w wywołaniu rekurencyjnym nazywa się to "dump", podczas gdy definiowanie czasu jest jego "mydump"
Vikas


1
to zabija Chrome i Firefox z "zbyt dużą rekurencją", gdy są używane do badania obiektu jquery
slashdottir

@slashdottir łatwo to naprawić, sprawdzającif (level > 10) return level_padding + '<< too deep >>';
John Henckel

„Zbyt duża rekursja” występuje z powodu odwołania cyklicznego (gdy parametr potomny jednego obiektu odwołuje się do jego obiektu nadrzędnego). Można to rozwiązać, zapamiętując wszystkich rodziców o aktualnej wartości i jeśli aktualna wartość pasuje do jednego z rodziców, przestań szukać dalej.
Alex Velickiy

42

Jeśli korzystasz z Chrome, Firefox lub IE10 +, dlaczego nie rozszerzyć konsoli i użyć

(function() {
    console.dump = function(object) {
        if (window.JSON && window.JSON.stringify)
            console.log(JSON.stringify(object));
        else
            console.log(object);
    };
})();

zwięzłe rozwiązanie dla różnych przeglądarek.


Podoba mi się ten. Szczególnie dla przeglądarek, które nie obsługują zrzutów obiektów.
Aley

I może zastąp to "else console.log (obiekt);" z wywołaniem niestandardowej funkcji przechodzenia, jak w stackoverflow.com/a/3011557/2236012 powyżej? ...;)
CB

@CB „za dużo rekurencji” i zamrożona przeglądarka jest tym, co mnie dostaje w Firefoksie i Chrome.
slashdottir

3
JSON.stringify nie może serializować struktur cyklicznych. Nie będzie działać dla wszystkich obiektów.
Grzegorz Luczywo

24

Po prostu użyj:

console.dir(object);

otrzymasz ładną, klikalną reprezentację obiektu. Działa w Chrome i Firefox


1
Chrome i Firefox dają [obiekt obiektu]
slashdottir

Możesz to przetestować w konsoli (naciśnij F12) za pomocą console.dir({bar:"foo"}); czy twój obiekt nadpisuje metodę toString?
droid mons

wydaje się działać przynajmniej w konsoli. prawdopodobnie userr przeze mnie. dziękuję
slashdottir

taka słodka funkcja
tomalone

12

W przypadku Chrome / Chromium

console.log(myObj)

lub jest równoważny

console.debug(myObj)


4

Użycie console.log(object)spowoduje przeniesienie obiektu do konsoli Javascript, ale nie zawsze tego chcesz. Użycie JSON.stringify(object)zwróci większość rzeczy, które mają być przechowywane w zmiennej, na przykład, aby wysłać je do wejścia textarea i przesłać zawartość z powrotem na serwer.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.