Gibt es ein Äquivalent für var_dump (PHP) in Javascript?

258

Wir müssen sehen, welche Methoden / Felder ein Objekt in Javascript hat.

eddy147
quelle
3
Es hängt teilweise davon ab, wie Sie es drucken möchten, aber dies ist eine wirklich schöne Implementierung, die etwas HTML zurückgibt, das Sie dann an Ihr Dokument anhängen (oder in ein debugdiv schreiben ) können: james.padolsey.com/javascript/prettyprint-for- Javascript
Alex Vidal
Ich erstelle einen JavaScript-Code, der das Ergebnis wie PHPs var_dump
1
Ich fand dieses Code-Snippet viel besser und verwende es in meinen Projekten: phpjs.org/functions/var_dump:604
Hafiz
Ich benutze die Funktion auf dieser Seite: theredpine.wordpress.com/2011/10/23/var_dump-for-javascript

Antworten:

220

Wie die anderen sagten, können Sie Firebug verwenden, und das macht Ihnen keine Sorgen um Firefox. Chrome und Safari verfügen beide über eine integrierte Entwicklerkonsole, die über eine nahezu identische Oberfläche wie die Firebug-Konsole verfügt. Daher sollte Ihr Code über diese Browser hinweg portierbar sein. Für andere Browser gibt es Firebug Lite .

Wenn Firebug für Sie keine Option ist, 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, nicht jede einzelne Eigenschaft zu alarmieren: Einige Objekte haben eine Menge Eigenschaften und Sie sind den ganzen Tag dort und klicken auf "OK", "OK", "OK", "O ... verdammt, das war die Eigenschaft, die ich war Auf der Suche nach".

nickf
quelle
6
Ich würde auch dagegen empfehlen - ehrlich gesagt würde ich nur console.debug verwenden. Aber ich habe auf die Möglichkeit einer Schleife hingewiesen - es liegt am Benutzer, was er mit jeder Eigenschaft tun möchte
Ken
Ich benutze Firebug jetzt schon eine Weile, war mir aber von Firebug Lite nicht bewusst, danke, dass Sie darauf hingewiesen haben.
Codefin
@nickf, darf ich Sie um einen Besuch unter stackoverflow.com/questions/9192990/… bitten ? Donnow, ob eine solche Anfrage im Kommentar akzeptabel ist.
Istiaque Ahmed
Ich denke, eine etwas robustere Version dieser Funktion gibt es unter stackoverflow.com/a/11315561/1403755, die im Wesentlichen ein Duplikat von print_r für PHP ist
TorranceScott
108

Wenn Sie Firefox verwenden, ist die Firebug-Plug-In- Konsole eine hervorragende Möglichkeit, Objekte zu untersuchen

console.debug(myObject);

Alternativ können Sie die Eigenschaften (einschließlich Methoden) wie folgt durchlaufen:

for (property in object) {
    // do what you want with property, object[property].value
}
Ken
quelle
1
Ich liebe diese Methode, weil ich nur ein paar Bytes eingeben muss. Ich benutze es oft.
UserBG
Dies funktioniert auch bei der Entwicklung reaktionsnativer Apps - ich liebe es!
luk2302
59

Viele moderne Browser unterstützen die folgende Syntax:

JSON.stringify(myVar);
Preis
quelle
5
Es wird eine Ausnahme ausgelöst, wenn kreisförmige Strukturen empfangen werden, anstatt sich vor ihnen zu schützen.
Coyote
Wie bei den console.Optionen wird hier nur der Inhalt der Variablen angezeigt. Die Variable wird nicht beschriftet. Wenn Sie also eine Reihe von Variablen ausgeben, müssen Sie jede Variable manuell beschriften. :-(
Synetech
27

Es kann nicht genug angegeben werden, dass Sie dafür console.debug (Objekt) verwenden können. Diese Technik spart Ihnen buchstäblich Hunderte von Stunden pro Jahr, wenn Sie dies für Ihren Lebensunterhalt tun: p

AceoStar
quelle
2
Das ist erstaunlich. Ich hatte bis heute noch nie von console.debug (Objekt) gehört, und es hat mir eine Menge Zeit bei einem Formular gespart, mit dem ich seit drei Tagen zu kämpfen habe. Innerhalb von 20 Minuten hatte ich es behoben. Danke dir!
ShiningLight
Es wäre besser, wenn der Name der Variablen tatsächlich angezeigt würde, anstatt nur deren Inhalt, damit Sie eine Reihe von Variablen gleichzeitig sehen können, ohne sie alle manuell beschriften zu müssen. ¬_¬
Synetech
@ Synetech versuchen console.debug({object}). Wenn Sie mehrere benötigen : console.debug({object1, object2}).
SEoF
10

Um die Frage aus dem Kontext des Titels dieser Frage zu beantworten, ist hier eine Funktion, die etwas Ähnliches wie ein PHP var_dump tut. Es gibt nur eine Variable pro Aufruf aus, gibt jedoch den Datentyp sowie den Wert an und durchläuft Arrays und Objekte [auch wenn es sich um Arrays von Objekten handelt und umgekehrt]. Ich bin 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;
    }
}
ReverseEMF
quelle
7

console.dir (am Ende der verlinkten Seite) in firebug oder im Google-Chrome-Webinspektor gibt eine interaktive Liste der Eigenschaften eines Objekts aus.

Siehe auch diese Stack-O-Antwort

David
quelle
Schade, dass es nicht wirklich beschriftet wird. Es zeigt nur seinen Wert an, was nicht hilft, wenn Sie eine Reihe von Variablen sehen möchten. : - |
Synetech
7

Sie möchten das gesamte Objekt (alle verschachtelten Ebenen von Objekten und Variablen darin) in JSON-Form anzeigen. JSON steht für JavaScript Object Notation, und das Ausdrucken einer JSON-Zeichenfolge Ihres Objekts ist ein gutes Äquivalent zu var_dump(um eine Zeichenfolgendarstellung eines JavaScript-Objekts zu erhalten). Glücklicherweise ist JSON im Code sehr einfach zu verwenden, und das JSON-Datenformat ist auch ziemlich gut lesbar.

Beispiel:

var objectInStringFormat = JSON.stringify(someObject);
alert(objectInStringFormat);
user5280460
quelle
6

Wenn Sie Firebug verwenden, können Sie console.log verwenden, um ein Objekt auszugeben und ein mit Hyperlinks versehenes, durchsuchbares Element in der Konsole abzurufen .

Paul Dixon
quelle
Das Problem dabei ist, dass die Variable nicht beschriftet wird. Wenn Sie also eine Reihe von Variablen ausgeben, müssen Sie sie alle manuell beschriften, um sie zu unterscheiden. : - \
Synetech
4

Eine kleine Verbesserung der Funktion von nickf für diejenigen, die den Typ der eingehenden Variablen nicht 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;
    }
}
Naterudd
quelle
4

Ich habe die Antwort von Nickf verbessert, sodass sie rekursiv Objekte durchläuft:

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;
}
Stan
quelle
4
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 in Google Chrome und Mozilla Firefox ordnungsgemäß funktionieren (wenn Sie mit einer alten Version von Firefox arbeiten und das Firebug-Plugin installieren müssen).
In Internet Explorer 8 oder höher müssen Sie folgende Schritte ausführen :

  • Starten Sie "Developer Tools", indem Sie auf die Schaltfläche F12 klicken
  • Klicken Sie in der Registerkartenliste auf die Registerkarte "Skript".
  • Klicken Sie rechts auf die Schaltfläche "Konsole"

Weitere Informationen finden Sie unter folgender URL: https://developer.chrome.com/devtools/docs/console-api

Halayem Anis
quelle
4

Sie können einfach das NPM-Paket var_dump verwenden

npm install var_dump --save-dev

Verwendung:

const var_dump = require('var_dump')

var variable = {
  'data': {
    'users': {
      'id': 12,
      'friends': [{
        'id': 1,
        'name': 'John Doe'
      }]
    }
  }
}

// print the variable using var_dump
var_dump(variable)

Dies wird gedruckt:

object(1) {
    ["data"] => object(1) {
        ["users"] => object(2) {
            ["id"] => number(12)
            ["friends"] => array(1) {
                [0] => object(2) {
                    ["id"] => number(1)
                    ["name"] => string(8) "John Doe"
                }
            }
        }
    }
}

Link: https://www.npmjs.com/package/@smartankur4u/vardump

Dank mir später!

ankurnarkhede
quelle
3

Wenn Sie nach einer in JS konvertierten PHP-Funktion suchen, gibt es diese kleine Site: http://phpjs.org . Dort können Sie den größten Teil der PHP-Funktion zuverlässig in JS schreiben lassen. für var_dump versuchen Sie: http://phpjs.org/functions/var_dump/ (überprüfen Sie den oberen Kommentar, dies hängt von "echo" ab, das auch von derselben Site heruntergeladen werden kann)

Hermann Stephane Ntsamo
quelle
2

Ich habe die erste Antwort verwendet, aber ich hatte das Gefühl, dass eine Rekursion darin fehlt.

Das Ergebnis war folgendes:

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);
}
Doglas
quelle
2

Basierend auf früheren Funktionen in diesem Beitrag. Rekursiver Modus und Einrückung hinzugefügt.

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)
Daweb
quelle
Dies ist gut, aber es wäre besser, wenn der Name der Variablen angezeigt würde (wie in PHP), damit Sie mehrere Variablen unterscheiden können, ohne sie manuell beschriften zu müssen.
Synetech
0

Das Folgende ist mein Lieblingsäquivalent zu var_dump / print_r in Javascript zu PHPs var_dump.

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

  //The padding given at the beginning of the line.
  var level_padding = "";
  for(var j=0;j<level+1;j++) level_padding += "    ";

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

    if(typeof(value) == 'object') { //If it is an array,
     dumped_text += level_padding + "'" + item + "' ...\n";
     dumped_text += dump(value,level+1);
    } else {
     dumped_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
    }
   }
  } else { //Stings/Chars/Numbers etc.
   dumped_text = "===>"+arr+"<===("+typeof(arr)+")";
  }
  return dumped_text;
 }
Blackbam
quelle
0

Spät im Spiel, aber hier ist eine wirklich praktische Funktion, die sehr einfach zu bedienen ist, die es Ihnen ermöglicht, beliebig viele Argumente eines beliebigen Typs zu übergeben und den Objektinhalt im Browser-Konsolenfenster anzuzeigen, als hätten Sie die Konsole aufgerufen. Log von JavaScript - aber von PHP

Beachten Sie, dass Sie Tags auch verwenden können, indem Sie 'TAG-YourTag' übergeben. Diese werden angewendet, bis ein anderes Tag gelesen wird, z. B. 'TAG-YourNextTag'.

/*
*   Brief:          Print to console.log() from PHP
*   Description:    Print as many strings,arrays, objects, and other data types to console.log from PHP.
*                   To use, just call consoleLog($data1, $data2, ... $dataN) and each dataI will be sent to console.log - note that
*                   you can pass as many data as you want an this will still work.
*
*                   This is very powerful as it shows the entire contents of objects and arrays that can be read inside of the browser console log.
*                   
*                   A tag can be set by passing a string that has the prefix TAG- as one of the arguments. Everytime a string with the TAG- prefix is
*                   detected, the tag is updated. This allows you to pass a tag that is applied to all data until it reaches another tag, which can then
*                   be applied to all data after it.
*
*                   Example:
*                   consoleLog('TAG-FirstTag',$data,$data2,'TAG-SecTag,$data3); 
*                   Result:
*                       FirstTag '...data...'
*                       FirstTag '...data2...'
*                       SecTag   '...data3...' 
*/
function consoleLog(){
    if(func_num_args() == 0){
        return;
    }

    $tag = '';
    for ($i = 0; $i < func_num_args(); $i++) {
        $arg = func_get_arg($i);
        if(!empty($arg)){       
            if(is_string($arg)&& strtolower(substr($arg,0,4)) === 'tag-'){
                $tag = substr($arg,4);
            }else{      
                $arg = json_encode($arg, JSON_HEX_TAG | JSON_HEX_AMP );
                echo "<script>console.log('".$tag." ".$arg."');</script>";
            }       
        }
    }
}

HINWEIS : func_num_args () und func_num_args () sind PHP-Funktionen zum Lesen einer dynamischen Anzahl von Eingabeargumenten und ermöglichen es dieser Funktion, unendlich viele console.log-Anforderungen von einem Funktionsaufruf zu erhalten

Chris Sprague
quelle