Esiste un equivalente per var_dump (PHP) in Javascript?


258

Dobbiamo vedere quali metodi / campi ha un oggetto in Javascript.


3
Dipende in parte da come vuoi stamparlo, ma questa è un'implementazione davvero piacevole che restituisce un po 'di HTML che puoi quindi aggiungere al tuo documento (o scrivere in un debugdiv): james.padolsey.com/javascript/prettyprint-for- javascript
Alex Vidal,

Creo un codice JavaScript che formatta il risultato come var_dump di PHP: rubsphp.blogspot.com/2011/03/vardump-para-javascript.html

1
Ho trovato questo frammento di codice molto meglio e lo uso nei miei progetti: phpjs.org/functions/var_dump:604
Hafiz,

Uso la funzione presente in questo sito: theredpine.wordpress.com/2011/10/23/var_dump-for-javascript

Risposte:


220

Come hanno detto gli altri, puoi usare Firebug e questo non ti preoccuperà su Firefox. Chrome e Safari hanno entrambi una console per sviluppatori integrata che ha un'interfaccia quasi identica alla console di Firebug, quindi il tuo codice dovrebbe essere portatile su quei browser. Per altri browser, c'è Firebug Lite .

Se Firebug non è un'opzione per te, prova questo semplice script:

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

Sconsiglio di avvisare ogni singola proprietà: alcuni oggetti hanno MOLTE proprietà e sarai lì tutto il giorno facendo clic su "OK", "OK", "OK", "O ... dannazione che era la proprietà che ero cercando".


6
Lo sconsiglio anche io - francamente userò solo console.debug. Ma stavo sottolineando la possibilità di eseguire il loop - spetta all'utente cosa vogliono fare con ogni proprietà
Ken

Sto usando Firebug da un po 'di tempo, ma non ero a conoscenza di Firebug Lite, grazie per averlo segnalato.
codefin

@nickf, posso richiederti di visitare lo stackoverflow.com/questions/9192990/… ? Non so se tale richiesta in commento sia accettabile.
Istiaque Ahmed,

Penso che esista una versione leggermente più robusta di questa funzione su stackoverflow.com/a/11315561/1403755 che è essenzialmente un duplicato di print_r per php
TorranceScott

108

Se si utilizza firefox, la console del plug-in firebug è un modo eccellente di esaminare gli oggetti

console.debug(myObject);

In alternativa è possibile scorrere le proprietà (compresi i metodi) in questo modo:

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

1
Adoro questo metodo perché ho solo bisogno di digitare pochi byte. Lo uso spesso.
userBG

Funziona anche quando si sviluppano app native per reagire: adoralo!
luk2302,

59

Molti browser moderni supportano la seguente sintassi:

JSON.stringify(myVar);

5
Emette un'eccezione quando riceve strutture circolari invece di proteggerle.
Coyote,

Come le console.opzioni, questo mostra solo il contenuto della variabile, non etichetta la variabile, quindi se scarichi un mucchio di variabili, devi etichettarle manualmente. :-(
Synetech,

27

Non si può affermare abbastanza che è possibile utilizzare console.debug (oggetto) per questo. Questa tecnica ti farà risparmiare letteralmente centinaia di ore all'anno se lo fai per vivere: p


2
È stupefacente. Non avevo mai sentito parlare di console.debug (oggetto) prima di oggi, e mi ha risparmiato un sacco di tempo su un modulo con cui ho lottato per tre giorni. In 20 minuti l'ho risolto. Grazie!
ShiningLight,

Sarebbe meglio se visualizzasse effettivamente il nome della variabile anziché solo il suo contenuto in modo da poter vedere un mucchio di variabili contemporaneamente senza doverle etichettare manualmente tutte. ¬_¬
Synetech,

Prova @Synetech console.debug({object}). Se avete bisogno di più: console.debug({object1, object2}).
SEoF

10

Per rispondere alla domanda dal contesto del titolo di questa domanda, ecco una funzione che fa qualcosa di simile a un var_dump di PHP. Esegue il dump di una sola variabile per chiamata, ma indica sia il tipo di dati che il valore e scorre tra array e oggetti [anche se sono array di oggetti e viceversa]. Sono sicuro che questo può essere migliorato. Sono più un ragazzo di PHP.

/**
 * 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;
    }
}

7

console.dir (verso la parte inferiore della pagina collegata) in firebug o nel web-inspector google-chrome genererà un elenco interattivo delle proprietà di un oggetto.

Vedi anche questa risposta Stack-O


Peccato che in realtà non lo etichetta; mostra solo il suo valore che non aiuta se vuoi vedere un mucchio di variabili. : - |
Synetech,

7

Volete vedere l'intero oggetto (tutti i livelli nidificati di oggetti e variabili al suo interno) in forma JSON. JSON è l'acronimo di JavaScript Object Notation e la stampa di una stringa JSON dell'oggetto è un buon equivalente di var_dump(per ottenere una rappresentazione di stringa di un oggetto JavaScript). Fortunatamente, JSON è molto facile da usare nel codice e il formato dei dati JSON è anche abbastanza leggibile dall'uomo.

Esempio:

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

6

Se si utilizza Firebug, è possibile utilizzare console.log per generare un oggetto e ottenere un oggetto ipertestuale esplorabile nella console.


Il problema è che non etichetta la variabile, quindi se scarichi un mucchio di variabili, devi etichettarle tutte manualmente per differenziarle. : - \
Synetech,

4

Un po 'di miglioramento sulla funzione di nickf per coloro che non conoscono il tipo di variabile in arrivo:

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

Ho migliorato la risposta di Nickf, quindi ricicla ricorsivamente attraverso gli oggetti:

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

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');

Questi dovrebbero funzionare correttamente su Google Chrome e Mozilla Firefox (se stai utilizzando una versione precedente di firefox, quindi devi installare il plug-in Firebug)
Su Internet Explorer 8 o versione successiva devi fare come segue:

  • Avviare "Strumenti per sviluppatori, facendo clic sul pulsante F12
  • Nell'elenco delle schede, fare clic sulla scheda "Script"
  • Fai clic sul pulsante "Console" sul lato destro

Per ulteriori informazioni è possibile visitare questo URL: https://developer.chrome.com/devtools/docs/console-api


4

Puoi semplicemente usare il pacchetto NPM var_dump

npm install var_dump --save-dev

Uso:

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)

Questo stamperà:

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

Ringraziami più tardi!



2

Ho usato la prima risposta, ma sentivo che mancava una ricorsione in essa.

Il risultato è stato questo:

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

2

Basato sulle funzioni precedenti presenti in questo post. Aggiunta modalità ricorsiva e rientro.

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

Esempio

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>";

Risultato

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

Questo è buono, ma sarebbe meglio se mostrasse il nome della variabile (come in PHP), in modo da poter differenziare più variabili senza doverle etichettare manualmente.
Synetech,

0

Quello che segue è il mio equivalente var_dump / print_r preferito in Javascript ai PHP 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;
 }

0

In ritardo al gioco, ma ecco una funzione davvero utile che è super semplice da usare, ti consente di passare tutti gli argomenti che desideri, di qualsiasi tipo, e visualizzerà il contenuto dell'oggetto nella finestra della console del browser come se avessi chiamato console. accedi da JavaScript, ma da PHP

Nota, puoi utilizzare anche i tag passando "TAG-YourTag" e verrà applicato fino a quando non verrà letto un altro tag, ad esempio "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>";
            }       
        }
    }
}

NOTA: func_num_args () e func_num_args () sono funzioni php per la lettura di un numero dinamico di argomenti di input e consentono a questa funzione di avere infinite richieste console.log da una chiamata di funzione

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.