2008-11-27 6 views
237

Wir müssen sehen, welche Methoden/Felder ein Objekt in Javascript hat.Gibt es eine Entsprechung für var_dump (PHP) in Javascript?

+3

Es hängt teilweise davon ab, wie Sie es drucken möchten, aber das ist eine wirklich nette Implementierung, die HTML zurückgibt, die Sie dann an Ihr Dokument anhängen können (oder schreiben Sie an ein 'debug'div): http://james.padolsey.com/javascript/prettyprint-for-javascript/ –

+0

Ich erstelle einen JavaScript-Code, der das Ergebnis wie das var_dump von PHP formatiert: http://rubsphp.blogspot.com/2011/03/vardump-para-javascript. html –

+1

Ich fand diesen Code Snippet viel besser und ich benutze dies in meinen Projekten: http://phpjs.org/functions/var_dump:604 – Hafiz

Antwort

209

Wie die anderen sagten, können Sie Firebug verwenden, und das wird Ihnen keine Sorgen über Firefox machen. Chrome & Safari hat beide eine integrierte Entwicklerkonsole, die eine fast identische Schnittstelle zur Firebug-Konsole hat, also sollte der Code über diese Browser übertragbar sein. Für andere Browser gibt es Firebug Lite.

Wenn Firebug keine Option für Sie ist, dann versuchen Sie dieses einfache Skript:

function dump(obj) { 
    var out = ''; 
    for (var i in obj) { 
     out += i + ": " + obj[i] + "\n"; 
    } 

    alert(out); 

    // or, if you wanted to avoid alerts... 

    var pre = document.createElement('pre'); 
    pre.innerHTML = out; 
    document.body.appendChild(pre) 
} 

Ich würde empfehlen, gegen jede einzelne Eigenschaft alarmieren: Einige Objekte haben eine Menge von Eigenschaften und Sie werden da sein den ganzen Tag über "OK", "OK", "OK", "O ... verdammt, das war das Objekt, nach dem ich gesucht habe".

+6

Ich würde es auch empfehlen - ehrlich gesagt würde ich nur console.debug verwenden.Aber ich habe auf die Möglichkeit des Schleifens hingewiesen - es ist Sache des Benutzers, was er mit jeder Eigenschaft machen will. – Ken

+0

Ich benutze den Firebug schon seit einer Weile, wusste aber nichts von Firebug Lite, danke für den Hinweis . – codefin

+0

@nickf, darf ich Sie bitten, einen Besuch bei http://stackoverflow.com/questions/9192990/how-to-print-the-associative-array-in-print-r-fashion-from-a-getjson zu haben -Anruf? Denken Sie daran, ob eine solche Anfrage im Kommentar akzeptabel ist. –

100

Wenn Sie Firefox verwenden, dann die firebug plug-in Konsole ist eine hervorragende Möglichkeit, Objekte zu untersuchen Sie

console.debug(myObject); 

Alternativ können die Eigenschaften Schleife durch (einschließlich der Methoden) wie folgt aus:

for (property in object) { 
    // do what you want with property, object[property].value 
} 
+6

Der 'console.debug()' Trick auch w Orks in Chrome. – SnakE

+1

Ich liebe diese Methode, weil ich nur ein paar Bytes eingeben muss. Ich benutze es oft. – ofko

+0

Dies funktioniert auch bei der Entwicklung von reaktions-nativen Apps - liebe es! – luk2302

6

Wenn Sie Verwenden Sie Firebug, können Sie console.log verwenden, um ein Objekt auszugeben, und ein hyperlinked, erforschbares Element in der Konsole zu erhalten.

22

Es kann nicht genug gesagt werden, dass Sie console.debug (object) dafür verwenden können. Diese Technik wird Sie buchstäblich Hunderte von Stunden pro Jahr sparen, wenn Sie dies tun für ein Leben: p

+1

Das ist erstaunlich, ich hatte noch nie von console.debug (object) gehört und es hat mich eine Menge Zeit auf einem Formular gerettet, mit dem ich seit drei Tagen zu kämpfen habe. Mit 20 Minuten hatte ich es behoben. Vielen Dank! – ShiningLight

48

Viele moderne Browser unterstützen die folgende Syntax:

JSON.stringify(myVar); 
+0

Dies funktioniert auch, aber da es alles entzieht, ist es schwieriger, die Daten visuell zu lesen. Diese Methode eignet sich jedoch hervorragend für den Datentransport. – ofko

+5

Es löst eine Ausnahme beim Empfang von kreisförmigen Strukturen statt Schutz gegen sie. – Coyote

7

console.dir (in Richtung der Unterseite der Seite,) entweder in firebug oder google-chrome web-inspector wird eine interaktive Auflistung der Eigenschaften eines Objekts ausgeben.

Siehe auch this Stack-O answer

4

Ein bisschen Verbesserung auf Nickf die Funktion für diejenigen, die in den kommenden nicht den Typ der Variablen kennen:

function dump(v) { 
    switch (typeof v) { 
     case "object": 
      for (var i in v) { 
       console.log(i+":"+v[i]); 
      } 
      break; 
     default: //number, string, boolean, null, undefined 
      console.log(typeof v+":"+v); 
      break; 
    } 
} 
4

I Nickf Antwort verbessert, so rekursiv es Schleifen durch Objekte:

function var_dump(obj, element) 
{ 
    var logMsg = objToString(obj, 0); 
    if (element) // set innerHTML to logMsg 
    { 
     var pre = document.createElement('pre'); 
     pre.innerHTML = logMsg; 
     element.innerHTML = ''; 
     element.appendChild(pre); 
    } 
    else // write logMsg to the console 
    { 
     console.log(logMsg); 
    } 
} 

function objToString(obj, level) 
{ 
    var out = ''; 
    for (var i in obj) 
    { 
     for (loop = level; loop > 0; loop--) 
     { 
      out += " "; 
     } 
     if (obj[i] instanceof Object) 
     { 
      out += i + " (Object):\n"; 
      out += objToString(obj[i], level + 1); 
     } 
     else 
     { 
      out += i + ": " + obj[i] + "\n"; 
     } 
    } 
    return out; 
} 
8

die Frage aus dem Zusammenhang der Titel dieser Frage zu beantworten, hier ist eine Funktion, die etwas ähnlich wie bei einem PH tut P var_dump. Es gibt nur eine Variable pro Aufruf aus, aber es zeigt sowohl den Datentyp als auch den Wert an und es iteriert durch Arrays und Objekte [auch wenn sie Arrays von Objekten sind und umgekehrt]. Ich bin mir sicher, dass dies verbessert werden kann. Ich bin eher ein PHP-Typ.

/** 
* Does a PHP var_dump'ish behavior. It only dumps one variable per call. The 
* first parameter is the variable, and the second parameter is an optional 
* name. This can be the variable name [makes it easier to distinguish between 
* numerious calls to this function], but any string value can be passed. 
* 
* @param mixed var_value - the variable to be dumped 
* @param string var_name - ideally the name of the variable, which will be used 
*  to label the dump. If this argumment is omitted, then the dump will 
*  display without a label. 
* @param boolean - annonymous third parameter. 
*  On TRUE publishes the result to the DOM document body. 
*  On FALSE a string is returned. 
*  Default is TRUE. 
* @returns string|inserts Dom Object in the BODY element. 
*/ 
function my_dump (var_value, var_name) 
{ 
    // Check for a third argument and if one exists, capture it's value, else 
    // default to TRUE. When the third argument is true, this function 
    // publishes the result to the document body, else, it outputs a string. 
    // The third argument is intend for use by recursive calls within this 
    // function, but there is no reason why it couldn't be used in other ways. 
    var is_publish_to_body = typeof arguments[2] === 'undefined' ? true:arguments[2]; 

    // Check for a fourth argument and if one exists, add three to it and 
    // use it to indent the out block by that many characters. This argument is 
    // not intended to be used by any other than the recursive call. 
    var indent_by = typeof arguments[3] === 'undefined' ? 0:arguments[3]+3; 

    var do_boolean = function (v) 
    { 
     return 'Boolean(1) '+(v?'TRUE':'FALSE'); 
    }; 

    var do_number = function(v) 
    { 
     var num_digits = (''+v).length; 
     return 'Number('+num_digits+') '+v; 
    }; 

    var do_string = function(v) 
    { 
     var num_chars = v.length; 
     return 'String('+num_chars+') "'+v+'"'; 
    }; 

    var do_object = function(v) 
    { 
     if (v === null) 
     { 
      return "NULL(0)"; 
     } 

     var out = ''; 
     var num_elem = 0; 
     var indent = ''; 

     if (v instanceof Array) 
     { 
      num_elem = v.length; 
      for (var d=0; d<indent_by; ++d) 
      { 
       indent += ' '; 
      } 
      out = "Array("+num_elem+") \n"+(indent.length === 0?'':'|'+indent+'')+"("; 
      for (var i=0; i<num_elem; ++i) 
      { 
       out += "\n"+(indent.length === 0?'':'|'+indent)+"| ["+i+"] = "+my_dump(v[i],'',false,indent_by); 
      } 
      out += "\n"+(indent.length === 0?'':'|'+indent+'')+")"; 
      return out; 
     } 
     else if (v instanceof Object) 
     { 
      for (var d=0; d<indent_by; ++d) 
      { 
       indent += ' '; 
      } 
      out = "Object \n"+(indent.length === 0?'':'|'+indent+'')+"("; 
      for (var p in v) 
      { 
       out += "\n"+(indent.length === 0?'':'|'+indent)+"| ["+p+"] = "+my_dump(v[p],'',false,indent_by); 
      } 
      out += "\n"+(indent.length === 0?'':'|'+indent+'')+")"; 
      return out; 
     } 
     else 
     { 
      return 'Unknown Object Type!'; 
     } 
    }; 

    // Makes it easier, later on, to switch behaviors based on existance or 
    // absence of a var_name parameter. By converting 'undefined' to 'empty 
    // string', the length greater than zero test can be applied in all cases. 
    var_name = typeof var_name === 'undefined' ? '':var_name; 
    var out = ''; 
    var v_name = ''; 
    switch (typeof var_value) 
    { 
     case "boolean": 
      v_name = var_name.length > 0 ? var_name + ' = ':''; // Turns labeling on if var_name present, else no label 
      out += v_name + do_boolean(var_value); 
      break; 
     case "number": 
      v_name = var_name.length > 0 ? var_name + ' = ':''; 
      out += v_name + do_number(var_value); 
      break; 
     case "string": 
      v_name = var_name.length > 0 ? var_name + ' = ':''; 
      out += v_name + do_string(var_value); 
      break; 
     case "object": 
      v_name = var_name.length > 0 ? var_name + ' => ':''; 
      out += v_name + do_object(var_value); 
      break; 
     case "function": 
      v_name = var_name.length > 0 ? var_name + ' = ':''; 
      out += v_name + "Function"; 
      break; 
     case "undefined": 
      v_name = var_name.length > 0 ? var_name + ' = ':''; 
      out += v_name + "Undefined"; 
      break; 
     default: 
      out += v_name + ' is unknown type!'; 
    } 

    // Using indent_by to filter out recursive calls, so this only happens on the 
    // primary call [i.e. at the end of the algorithm] 
    if (is_publish_to_body && indent_by === 0) 
    { 
     var div_dump = document.getElementById('div_dump'); 
     if (!div_dump) 
     { 
      div_dump = document.createElement('div'); 
      div_dump.id = 'div_dump'; 

      var style_dump = document.getElementsByTagName("style")[0]; 
      if (!style_dump) 
      { 
       var head = document.getElementsByTagName("head")[0]; 
       style_dump = document.createElement("style"); 
       head.appendChild(style_dump); 
      } 
      // Thank you Tim Down [http://stackoverflow.com/users/96100/tim-down] 
      // for the following addRule function 
      var addRule; 
      if (typeof document.styleSheets != "undefined" && document.styleSheets) { 
       addRule = function(selector, rule) { 
        var styleSheets = document.styleSheets, styleSheet; 
        if (styleSheets && styleSheets.length) { 
         styleSheet = styleSheets[styleSheets.length - 1]; 
         if (styleSheet.addRule) { 
          styleSheet.addRule(selector, rule) 
         } else if (typeof styleSheet.cssText == "string") { 
          styleSheet.cssText = selector + " {" + rule + "}"; 
         } else if (styleSheet.insertRule && styleSheet.cssRules) { 
          styleSheet.insertRule(selector + " {" + rule + "}", styleSheet.cssRules.length); 
         } 
        } 
       }; 
      } else { 
       addRule = function(selector, rule, el, doc) { 
        el.appendChild(doc.createTextNode(selector + " {" + rule + "}")); 
       }; 
      } 

      // Ensure the dump text will be visible under all conditions [i.e. always 
      // black text against a white background]. 
      addRule('#div_dump', 'background-color:white', style_dump, document); 
      addRule('#div_dump', 'color:black', style_dump, document); 
      addRule('#div_dump', 'padding:15px', style_dump, document); 

      style_dump = null; 
     } 

     var pre_dump = document.getElementById('pre_dump'); 
     if (!pre_dump) 
     { 
      pre_dump = document.createElement('pre'); 
      pre_dump.id = 'pre_dump'; 
      pre_dump.innerHTML = out+"\n"; 
      div_dump.appendChild(pre_dump); 
      document.body.appendChild(div_dump); 
     } 
     else 
     { 
      pre_dump.innerHTML += out+"\n"; 
     } 
    } 
    else 
    { 
     return out; 
    } 
} 
3

Wenn Sie für PHP-Funktion umgewandelt in JS suchen, gibt es diese kleine Website: http://phpjs.org. Dort können Sie die meisten PHP-Funktionen zuverlässig in JS geschrieben bekommen.für Var_dump Versuch: http://phpjs.org/functions/var_dump/ (stellen Sie sicher den Top-Kommentar zu überprüfen, hängt dies von „Echo“, der auch von der gleichen Seite heruntergeladen werden kann)

3
console.log(OBJECT|ARRAY|STRING|...); 
console.info(OBJECT|ARRAY|STRING|...); 
console.debug(OBJECT|ARRAY|STRING|...); 
console.warn(OBJECT|ARRAY|STRING|...); 
console.assert(Condition, 'Message if false'); 

Diese sollten korrekt auf Google Chrome und Mozilla Firefox arbeiten (wenn Sie sind mit alten Firefox-Version ausgeführt wird, so müssen Sie Firebug Plugin)
auf Internet Explorer 8 oder höher Sie wie folgt installieren müssen tun:

  • Launch „Developer tools, die von
  • auf F12-Taste klicken
  • Auf der Registerkarte Liste, klicken Sie auf "Script" Tab“
  • Klicken Sie auf "Console" Button auf der rechten Seite

Weitere Informationen Sie diese URL besuchen: https://developer.chrome.com/devtools/docs/console-api

2

verwendete ich die erste Antwort, aber ich fühlte, dass eine Rekursion darin fehlte.

Das Ergebnis war:

function dump(obj) { 
    var out = ''; 
    for (var i in obj) { 
     if(typeof obj[i] === 'object'){ 
      dump(obj[i]); 
     }else{ 
      out += i + ": " + obj[i] + "\n"; 
     } 
    } 

    var pre = document.createElement('pre'); 
    pre.innerHTML = out; 
    document.body.appendChild(pre); 
} 
1

Basierend auf früheren in diesem Beitrag nicht gefunden Funktionen. Rekursiver Modus und Einzug hinzugefügt. das gesamte Objekt sehen (alle verschachtelten Ebenen von Objekten und Variablen innerhalb it) in JSON Form

function dump(v, s) { 
    s = s || 1; 
    var t = ''; 
    switch (typeof v) { 
    case "object": 
     t += "\n"; 
     for (var i in v) { 
     t += Array(s).join(" ")+i+": "; 
     t += dump(v[i], s+3); 
     } 
     break; 
    default: //number, string, boolean, null, undefined 
     t += v+" ("+typeof v+")\n"; 
     break; 
    } 
    return t; 
} 

Beispiel

var a = { 
    b: 1, 
    c: { 
    d:1, 
    e:2, 
    d:3, 
    c: { 
     d:1, 
     e:2, 
     d:3 
    } 
    } 
}; 

var d = dump(a); 
console.log(d); 
document.getElementById("#dump").innerHTML = "<pre>" + d + "</pre>"; 

Ergebnis

b: 1 (number) 
c: 
    d: 3 (number) 
    e: 2 (number) 
    c: 
     d: 3 (number) 
     e: 2 (number) 
3

Sie wollen. JSON steht für JavaScript Object Notation, und das Ausdrucken einer JSON-Zeichenfolge Ihres Objekts ist eine gute Entsprechung von var_dump (um eine Zeichenfolgendarstellung eines JavaScript-Objekts abzurufen). Glücklicherweise ist JSON sehr einfach in Code zu verwenden und das JSON-Datenformat ist auch sehr gut lesbar.

Beispiel:

var objectInStringFormat = JSON.stringify(someObject); 
alert(objectInStringFormat); 
0

Das folgende ist mein Favorit Var_dump/print_r Äquivalent in Javascript zu PHPs var_dump.

Verwandte Themen