Javascript에 var_dump (PHP)에 해당하는 것이 있습니까?


258

객체가 자바 스크립트에서 가지고있는 메소드 / 필드를 확인해야합니다.


3
인쇄 방법에 부분적으로 달려 있지만, 문서에 추가하거나 debugdiv에 쓸 수있는 HTML을 반환하는 정말 좋은 구현입니다 . james.padolsey.com/javascript/prettyprint-for- 자바 스크립트
Alex Vidal

PHP의 var_dump와 같은 결과 형식을 지정하는 JavaScript 코드를 만듭니다. rubsphp.blogspot.com/2011/03/vardump-para-javascript.html

1
나는이 코드 스 니펫을 훨씬 더 잘 발견하고 내 프로젝트에서 이것을 사용한다 : phpjs.org/functions/var_dump:604
Hafiz

이 사이트에서 찾은 기능을 사용합니다 : theredpine.wordpress.com/2011/10/23/var_dump-for-javascript

답변:


220

다른 사람들이 말했듯이 Firebug를 사용할 수 있으며 Firefox에서는 걱정할 필요가 없습니다. Chrome & Safari에는 모두 Firebug 콘솔과 거의 동일한 인터페이스를 갖춘 개발자 콘솔이 내장되어 있으므로 브라우저에서 코드를 이식 할 수 있어야합니다. 다른 브라우저에는 Firebug Lite가 있습니다.

Firebug가 당신을위한 옵션이 아니라면,이 간단한 스크립트를 사용해보십시오 :

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

각 개별 속성에 대해 경고하지 않는 것이 좋습니다. 일부 개체에는 많은 속성이 있으며 "OK", "OK", "OK", "O ...를 클릭하면 하루 종일있을 것입니다. 찾고있는".


6
솔직히 console.debug를 사용하고 싶습니다. 그러나 나는 루핑의 가능성을 지적하고 있었다-그것은 각 재산으로하고 싶은 것이 사용자에게 달려있다
Ken

지금까지 방화범을 사용해 왔지만 지적 해 주셔서 감사합니다.
codefin

@ nickf, stackoverflow.com/questions/9192990/…에 방문을 요청할 수 있습니까? 그러한 요청에 대한 의견이 수용 가능한지 안다.
Istiaque Ahmed

나는이 기능을 약간 더 강력한 버전에 존재하는 생각 stackoverflow.com/a/11315561/1403755 PHP를위한에서 print_r의 중복 본질적 인
TorranceScott

108

firefox를 사용하는 경우 firebug 플러그인 콘솔은 객체를 검사하는 훌륭한 방법입니다.

console.debug(myObject);

또는 다음과 같이 속성 (메소드 포함)을 반복 할 수 있습니다.

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

1
몇 바이트 만 입력하면되기 때문에이 방법이 마음에 듭니다. 자주 사용합니다.
userBG

이것은 반응 네이티브 앱을 개발할 때도 효과적입니다.
luk2302

59

많은 최신 브라우저가 다음 구문을 지원합니다.

JSON.stringify(myVar);

5
원형 구조물을 보호하지 않고받는 경우 예외를 발생시킵니다.
코요테

console.옵션 과 마찬가지로 변수의 내용 만 표시하고 변수에 레이블을 지정하지 않으므로 많은 변수를 덤프하는 경우 각 변수에 수동으로 레이블을 지정해야합니다. :-(
Synetech

27

이것을 위해 console.debug (object)를 사용할 수 있다고 충분히 말할 수는 없습니다. 이 기술을 사용하면 생계를 위해이 작업을 수행하면 연간 수백 시간을 절약 할 수 있습니다.


2
그 놀라운. 나는 오늘 전에 console.debug (object)에 대해 들어 본 적이 없으며 3 일 동안 어려움을 겪었던 형태로 많은 시간을 절약했습니다. 20 분 동안, 나는 그것을 고쳤다. 감사합니다!
ShiningLight

실제로 내용 대신 변수 이름을 표시하면 수동으로 모두 레이블을 지정하지 않고도 동시에 많은 변수를 볼 수 있습니다. ¬_¬
Synetech

@Synetech 시도하십시오 console.debug({object}). 여러 개가 필요한 경우 : console.debug({object1, object2}).
SEoF

10

이 질문의 제목 맥락에서 질문에 대답하기 위해 PHP var_dump와 비슷한 기능을 수행하는 함수가 있습니다. 호출 당 하나의 변수 만 덤프하지만 값뿐만 아니라 데이터 유형을 나타내며 배열과 객체를 반복합니다. 이것이 향상 될 수 있다고 확신합니다. 나는 더 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

Firebug 또는 google-chrome 웹 검사기에서 console.dir (링크 된 페이지의 아래쪽으로)은 객체 속성의 대화식 목록을 출력합니다.

참조 이 스택-O 응답


실제로 라벨이 붙어 있지 않은 것은 너무 나쁩니다. 그것은 많은 변수를보고 싶을 때 도움이되지 않는 값만 보여줍니다. :-|
Synetech

7

JSON 형식으로 전체 객체 (모든 중첩 된 수준의 객체 및 변수)를 JSON 형식으로 보려고합니다. JSON은 JavaScript Object Notation의 약자이며, 객체의 JSON 문자열을 인쇄하는 것은 var_dump(JavaScript 객체의 문자열 표현을 얻는 것과) 동등 합니다. 다행히 JSON은 코드에서 사용하기가 매우 쉽고 JSON 데이터 형식도 사람이 읽을 수 있습니다.

예:

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

6

Firebug를 사용하는 경우 console.log 를 사용 하여 객체를 출력하고 콘솔에서 하이퍼 링크로 탐색 가능한 항목을 얻을 수 있습니다.


이것에 대한 문제는 변수에 레이블을 지정하지 않기 때문에 많은 변수를 덤프하면 변수를 구별하기 위해 수동으로 모두 레이블을 지정해야합니다. :-\
Synetech

4

들어오는 변수의 유형을 모르는 사람들을 위해 nickf의 기능이 약간 개선되었습니다.

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의 대답을 향상 시켰으므로 객체를 재귀 적으로 반복합니다.

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

Chrome 및 Mozilla Firefox에서 올바르게 작동합니다 (이전 버전의 firefox로 실행중인 경우 Firebug 플러그인을 설치해야 함)
Internet Explorer 8 이상에서는 다음과 같이해야합니다.

  • F12 버튼을 클릭하여 "개발자 도구"를 시작하십시오.
  • 탭 목록에서 "스크립트"탭을 클릭하십시오.
  • 오른쪽에있는 "콘솔"버튼을 클릭하십시오

자세한 내용은 다음 URL을 방문하십시오. https://developer.chrome.com/devtools/docs/console-api


4

NPM 패키지 var_dump를 간단히 사용할 수 있습니다

npm install var_dump --save-dev

용법:

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)

인쇄됩니다 :

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

링크 : https://www.npmjs.com/package/@smartankur4u/vardump

나중에 감사합니다!


3

JS로 변환 된 PHP 함수를 찾고 있다면 다음과 같은 작은 사이트가 있습니다 : http://phpjs.org . 거기에서 대부분의 PHP 함수를 JS로 안정적으로 작성할 수 있습니다. 위해서 var_dump의 시도에 대해 : http://phpjs.org/functions/var_dump/ (상단 주석을 확인해야합니다,이 "에코", 같은 사이트에서 다운로드 할 수있는에 따라 다름)


2

첫 번째 대답을 사용했지만 재귀가 빠졌다고 느꼈습니다.

결과는 다음과 같습니다.

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

이 게시물에서 찾은 이전 기능을 기반으로합니다. 재귀 모드와 들여 쓰기가 추가되었습니다.

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

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

결과

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

이것은 좋지만 변수 이름 (예 : PHP)을 표시하면 수동으로 레이블을 지정할 필요없이 여러 변수를 구별 할 수 있습니다.
Synetech

0

다음은 Javascript에서 PHP 와 동등한 var_dump / print_rvar_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

게임에 늦었지만, 여기에 사용하기 매우 간단하고 원하는만큼 많은 인수를 전달할 수 있으며 콘솔을 호출 한 것처럼 브라우저 콘솔 창에 객체 내용을 표시 할 수있는 정말 편리한 기능이 있습니다. JavaScript에서 로그-PHP에서

'TAG-YourTag'를 전달하여 태그를 사용할 수도 있으며 다른 태그를 읽을 때까지 적용됩니다 (예 : '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>";
            }       
        }
    }
}

참고 : func_num_args ()func_num_args () 는 동적으로 많은 수의 입력 인수를 읽는 PHP 함수 이며이 함수는 한 번의 함수 호출에서 무한히 많은 console.log 요청을 가질 수 있습니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.