Javascript var_dump (PHP) eşdeğeri var mı?


258

Bir nesnenin Javascript'te hangi yöntemleri / alanları olduğunu görmemiz gerekir.


3
Kısmen nasıl yazdırmak istediğinize bağlıdır, ancak bu daha sonra belgenize ekleyebileceğiniz (veya bir div'e yazabileceğinizdebug ) bazı HTML döndüren gerçekten güzel bir uygulamadır : james.padolsey.com/javascript/prettyprint-for- javascript
Alex Vidal

PHP'nin var_dump gibi sonucu formatlayan bir JavaScript kodu oluşturuyorum: rubsphp.blogspot.com/2011/03/vardump-para-javascript.html

1
Bu kod snippet'ini çok daha iyi buldum ve bunu projelerimde kullanıyorum: phpjs.org/functions/var_dump:604
Hafız

Bu sitede bulunan işlevi kullanıyorum: theredpine.wordpress.com/2011/10/23/var_dump-for-javascript

Yanıtlar:


220

Diğerlerinin söylediği gibi, Firebug'u kullanabilirsiniz ve bu, Firefox'ta endişelenmenize gerek kalmayacaktır. Chrome ve Safari'nin her ikisi de Firebug'un konsoluyla neredeyse aynı arayüze sahip yerleşik bir geliştirici konsoluna sahiptir, bu nedenle kodunuzun bu tarayıcılarda taşınabilir olması gerekir. Diğer tarayıcılarda Firebug Lite var .

Firebug sizin için bir seçenek değilse, bu basit komut dosyasını deneyin:

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

Her münferit özelliği uyarmaya karşı öneriyorum: bazı nesnelerin bir sürü özelliği var ve bütün gün "Tamam", "Tamam", "Tamam", "O ... dammit olduğum özellik olacak aramak".


6
Ben de buna karşı tavsiye ederim - açıkçası ben sadece console.debug kullanırdım. Ama döngü olasılığına işaret ediyordum - her mülkle ne yapmak istediklerini kullanıcıya bağlı
Ken

Firebug'u bir süredir kullanıyorum, ancak Firebug Lite'ın farkında değildim, işaret ettiğiniz için teşekkürler.
codefin

@nickf, stackoverflow.com/questions/9192990/… adresini ziyaret etmenizi isteyebilir miyim ? Yorumdaki böyle bir talebin kabul edilebilir olup olmadığını bilin.
Istiaque Ahmed

Bence bu fonksiyonun biraz daha sağlam bir versiyonu php için print_r kopyası olan stackoverflow.com/a/11315561/1403755 adresinde mevcut
TorranceScott

108

Firefox kullanıyorsanız, kundakçı eklenti konsolu nesneleri incelemek için mükemmel bir yoldur

console.debug(myObject);

Alternatif olarak, aşağıdaki gibi özellikler (yöntemler dahil) arasında geçiş yapabilirsiniz:

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

1
Bu yöntemi seviyorum çünkü sadece birkaç bayt yazmam gerekiyor. Sık kullanıyorum.
userBG

Bu, yerel tepki içeren uygulamalar geliştirirken de çalışır - sevin!
luk2302

59

Birçok modern tarayıcı aşağıdaki sözdizimini destekler:

JSON.stringify(myVar);

5
Dairesel yapıları onlara karşı korumak yerine alırken bir istisna ateşler.
Coyote

Gibi console.seçenekler, bu sadece değişkenin içeriğini gösterir, bu değişkenlerin bir demet dökümü eğer öyleyse, değişken etiket etmez her birini el etiketlemek zorunda. :-(
Synetech

27

Bunun için console.debug (nesne) kullanabileceğiniz yeterince belirtilemez. Bu teknik, yaşamak için bunu yaparsanız yılda yüzlerce saatten tasarruf etmenizi sağlar: p


2
Bu inanılmaz. Bugün daha önce console.debug'u (nesne) duymamıştım ve üç gündür mücadele ettiğim bir formda bana tonlarca zaman kazandırdı. 20 dakika kaldım, düzelttim. Teşekkür ederim!
ShiningLight

Değişken adını yalnızca içeriği yerine gerçekte görüntülemesi daha iyi olurdu, böylece hepsini bir arada etiketlemek zorunda kalmadan bir grup değişkeni aynı anda görebilirsiniz. Et_¬
Synetech

@Synetech deneyin console.debug({object}). Birden gerekirse: console.debug({object1, object2}).
SEOF

10

Soruyu bu sorunun başlığından cevaplamak için, PHP var_dump işlevine benzer bir şey yapan bir işlev var. Çağrı başına yalnızca bir değişkeni döker, ancak veri türünün yanı sıra değeri gösterir ve dizi ve nesneler arasında yinelenir [Nesneler Dizisi olsalar da, tersi de geçerlidir]. Eminim bu geliştirilebilir. Ben daha çok PHP'li biriyim.

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

Firebug'daki veya google-chrome web denetçisindeki console.dir (bağlı sayfanın altına doğru) bir nesnenin özelliklerinin etkileşimli bir listesini çıkarır.

Ayrıca bkz. Stack-O cevabı


Çok kötü, aslında onu etiketlemiyor; yalnızca bir grup değişkeni görmek istiyorsanız yardımcı olmayan değerini gösterir. : - |
Synetech

7

Tüm nesneyi (içindeki nesnelerin ve içindeki değişkenlerin tüm iç düzeylerini) JSON formunda görmek istiyorsunuz. JSON, JavaScript Nesne Gösterimi anlamına gelir ve nesnenizin bir JSON dizesini yazdırmak, var_dump(bir JavaScript nesnesinin dize temsilini almak için) iyi bir eşdeğerdir . Neyse ki, JSON'un kodda kullanımı çok kolaydır ve JSON veri formatı da oldukça insan tarafından okunabilir.

Misal:

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

6

Firebug kullanıyorsanız, bir nesne çıktısı almak ve konsolda köprü bağlantılı, keşfedilebilir bir öğe almak için console.log dosyasını kullanabilirsiniz .


Buradaki sorun, değişkeni etiketlememesidir, bu nedenle bir grup değişkeni dökerseniz, farklılaştırmak için hepsini manuel olarak etiketlemeniz gerekir. : - \
Synetech

4

Gelen değişkenin türünü bilmeyenler için nickf'in işlevinde biraz iyileşme:

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

Nickf'in cevabını geliştirdim, bu yüzden tekrar tekrar nesneler arasında dolaşıyor:

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

Bunlar düzgün çalışmalıdır Google Chrome ve Mozilla Firefox'ta (eski firefox sürümüyle çalışıyorsanız, Firebug eklentisini yüklemeniz gerekir)
Internet Explorer 8 veya daha yeni bir sürümde aşağıdaki işlemleri yapmalısınız:

  • F12 Düğmesine tıklayarak "Geliştirici Araçları" nı başlatın
  • Sekme listesinde, "Komut Dosyası" Sekmesi "ni tıklayın
  • Sağ taraftaki "Konsol" Düğmesine tıklayın

Daha fazla bilgi için şu URL'yi ziyaret edebilirsiniz: https://developer.chrome.com/devtools/docs/console-api


4

Sadece var_dump NPM paketini kullanabilirsiniz

npm install var_dump --save-dev

Kullanımı:

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)

Bu yazdırılacak:

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

Bağlantı: https://www.npmjs.com/package/@smartankur4u/vardump

Sonra teşekkür et!



2

İlk cevabı kullandım, ama içinde bir özyineleme eksik olduğunu hissettim.

Sonuç şuydu:

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

Bu gönderide bulunan önceki işlevlere dayanarak. Özyinelemeli mod ve girinti eklendi.

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

Misal

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

Sonuç

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

Bu iyidir, ancak değişkenin adını (PHP'de olduğu gibi) göstermesi daha iyi olur, böylece birden çok değişkeni manuel olarak etiketlemek zorunda kalmadan ayırt edebilirsiniz.
Synetech

0

Aşağıdaki PHP için Javascript benim favori var_dump / print_r eşdeğeridirvar_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

Oyunun sonlarına doğru, ancak kullanımı çok kolay olan, istediğiniz kadar argüman geçirmenize izin veren gerçekten kullanışlı bir işlev ve konsol içeriğini pencerede çağırdığınız gibi görüntüleyeceksiniz. JavaScript'ten giriş yapın - ancak PHP'den

Etiketleri, 'TAG-YourTag' ileterek de kullanabilirsiniz ve başka bir etiket okunana kadar uygulanacaktır, örneğin, '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>";
            }       
        }
    }
}

NOT: func_num_args () ve func_num_args () , dinamik sayıda giriş argümanı okumak için php işlevleridir ve bu işlevin bir işlev çağrısından sonsuz sayıda console.log isteğine sahip olmasına izin verir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.