如何显示JavaScript对象?


1615

如何像alert使用变量一样以字符串格式显示JavaScript对象的内容?

我想显示对象的格式相同。


7
您能改一下您的问题吗?您所说的“格式化方式”是什么意思?例如,采用丰富的格式,例如粗体/斜体/等?
Sasha Chedygov,2009年

有没有办法通过使用某些控制台命令打印变量的值来显示变量的运行时值?
BlackPanther

1
@BlackPanther刚做console.log("", yourObject1, yourObject2, yourObject3, etc...);。可以做一个简短的版本console.log(yourObject1, yourObject2, etc...);
tom_mai78101 '07

2
您能否选择一个更准确地反映社区共识的更好答案?
HoldOffHunger

这样console.log('a string', aNumber, anObject)
onmyway133 '18

Answers:


1067

如果要出于调试目的打印对象,请使用以下代码:

var obj = {prop1: 'prop1Value', prop2: 'prop2Value', child: {childProp1: 'childProp1Value'}}
console.log(obj)

将显示:

屏幕截图控制台chrome

注意:只能记录该对象。例如,这将不起作用:

console.log('My object : ' + obj)

注意':您也可以在log方法中使用逗号,然后输出的第一行将是字符串,然后将呈现对象:

console.log('My object: ', obj);

43
使用JavaScript控制台(Shift + Control + J或Shift + Control + I,具体取决于Chrome版本)时,该功能也可以在Google Chrome上使用。还要注意,它的console.log(obj1, obj2)工作原理也非常好,因此console.log()在记录多个变量时不必调用每个对象。此外,请始终记住删除生产中的所有此类调用,因为这会破坏未实现该调用的浏览器(例如Internet Explorer)。
Felix

102
是的,它会打印[object Object],但旁边有一个小小的toggle切换按钮,可让您检查对象的内容。
休斯

12
@hughes实际上可以同时做到。我有一个用以下对象创建的对象:var obj = {“ foo”:false}; 另一个从服务器传递到回调中的对象,通过回调传递的对象带有小箭头,因此您可以打开它,静态创建的对象仅打印不带箭头的[object Object]。我也在尝试解决这个问题,还有其他想法吗?
Benstraw 2011年

124
console.log("id:"+obj);不正确,因为它输出一个字符串如您所见,有输出,你需要这样指定它:console.log("id:"); console.log(obj);
Anriëtte迈伯勒

14
试试看console.log(JSON.stringify(obj))console.dir(obj)
机器人男孩

2008

使用本机JSON.stringify方法。与嵌套对象一起使用,并且所有主流浏览器都支持此方法。

str = JSON.stringify(obj);
str = JSON.stringify(obj, null, 4); // (Optional) beautiful indented output.
console.log(str); // Logs output to dev tools console.
alert(str); // Displays output using window.alert()

链接到Mozilla API参考和其他示例。

obj = JSON.parse(str); // Reverses above operation (Just in case if needed.)

如果遇到此Javascript错误,请使用自定义JSON.stringify替换程序

"Uncaught TypeError: Converting circular structure to JSON"

326
对于更可读的输出,请尝试JSON.stringify(obj,null,4)。这将把它写成整齐的缩进文本
Ben Clayton

2
JSON.stringify只能显示一小部分javascript值,其余的将抛出异常-console.log没有此问题。
记得莫妮卡

11
如果您是像我这样的新手,请不要忘记,console.logconsole.log(JSON.stringify(obj,null, 4));
nilesh 2013年

2
ob = window时出现“未捕获的TypeError:将圆形结构转换为JSON”。
迈克尔

1
在某些情况下,它不起作用:它显示{}了一个非空对象。因此,一定console.log(obj)要先进行检查,然后再考虑strigify()返回对象为空{}
Sindarus

394
var output = '';
for (var property in object) {
  output += property + ': ' + object[property]+'; ';
}
alert(output);

1
这正是我想要的。我正在使用Google Maps v3,DirectionRenderer返回了一个对象。那有四个项目,其中一个对象的名称不断变化,所以我们需要找到它。为此,该方法确实有所帮助。除了这种方式,我们还可以获得属性和对象的所有名称。还是有其他方法可以找到对象和属性的名称?
Jayapal Chandran 2011年

34
+1,并非所有的javascript都可以在浏览器中运行或可以在其中进行调试。
Bill Yang

3
您可能大多数时候想用hasOwnProperty掩盖内置的碎片。
John

9
Omg-0:[; 1:o;2:b;3:j;4:e;5:c;6:t 7 :;8:O;9:b;10:j;11:e;12:c;13:t;14:];
JSideris

1
找到这个有点晚了,但是正如去年我的生日(8月29日)所要求的那样,这是一个工作中的小提琴。 jsfiddle.net/MrMarlow/fq53o6o9
MrMarlow 2015年

124

console.dir(object)

显示指定JavaScript对象的属性的交互式列表。此清单使您可以使用显示三角形检查子对象的内容。

请注意,该console.dir()功能是非标准的。请参阅MDN网络文档


1
是的,这是一个很好的解决方案,但是,仅当您只想记录对象(例如console.dir(obj))时,它才可以按预期的方式工作。如果要将字符串连接到输出,它将为您提供[object Object]。
Zoman

的一大优点console.dir是,在变量被垃圾回收之后,您仍然可以在控制台中扩展和读取值。这在此处的
Dawson B,

另一个好处console.dir是,将控制台保存到文件时,所有属性都按预期在文件中。仅使用console.log时不会发生这种情况。
Kepi

79

尝试这个 :

console.log(JSON.stringify(obj))

这将打印对象的字符串化版本。因此,[object]您将获得对象的内容而不是作为输出。


7
typeerror: Converting circular structure to JSON
Kaiden Prince

@KaidenPrince会为您的错误查看此答案:stackoverflow.com/questions/4816099/… 它可能是对象中的DOM元素。如果是这种情况,则最好尝试仅使用chrome或firefox登录到控制台并在那里进行检查。否则,您必须在调用JSON.stringify之前除去所有圆形元素,以使其工作。
Ace Hyzer

解决方案是,简单地将其拆分为2个独立的命令:console.log(“ id:”); console.log(obj);
Collin Chaffin

66

好的,Firefox(感谢@Bojangles提供详细信息)具有Object.toSource()将对象打印为JSON和的方法function(){}

我想,对于大多数调试目的而言,这就足够了。


6
Object.toSource()似乎不适用于Chrome,这是预期的吗?还是Chrome不属于“高级浏览器”?=)
tstyle

44
旧线程,只是通过Google找到的。.toSource()实际上是Firefox 。只是以为我会让你知道。
Bojangles

52

如果要使用警报来打印对象,可以执行以下操作:

alert("myObject is " + myObject.toSource());

它应该以字符串格式打印每个属性及其对应的值。


18
toSource()在非壁虎浏览器(例如Chrome,Safari)中不起作用
Yarin

37

如果您想以表格格式查看数据,可以使用

console.table(obj);

如果您单击表格列,可以对表格进行排序。

您还可以选择显示哪些列:

console.table(obj, ['firstName', 'lastName']);

您可以在此处找到有关console.table的更多信息



33

功能:

var print = function(o){
    var str='';

    for(var p in o){
        if(typeof o[p] == 'string'){
            str+= p + ': ' + o[p]+'; </br>';
        }else{
            str+= p + ': { </br>' + print(o[p]) + '}';
        }
    }

    return str;
}

用法:

var myObject = {
    name: 'Wilson Page',
    contact: {
        email: 'wilson@hotmail.com',
        tel: '123456789'
    }  
}

$('body').append( print(myObject) );

例:

http://jsfiddle.net/WilsonPage/6eqMn/


打印方法调用浏览器将页面打印为pdf:p
Marwen Trabelsi,2015年

@jsh,您应该绕开if-else并检查对象而不是字符串。更新的提琴:jsfiddle.net/6eqMn/594
Michael Walter

1
@wilsonpage如果我将整数值添加到tel属性,则会失败:(
ni3,17年

25

只需使用

JSON.stringify(obj)

var args_string = JSON.stringify(obj);
console.log(args_string);

要么

alert(args_string);

另外,javascript函数中的note会被视为对象。

另外要注意的是:

实际上,您可以像这样分配新属性并访问console.log或在警报中显示它

foo.moo = "stackoverflow";
console.log(foo.moo);
alert(foo.moo);

1
问题本身指出:“就像我们在“提示”变量时一样”,因此这并不是真正的答案。而且,您的其他选项“ JSON.stringify(obj)”已经在“ 2010年11月27日”中提到,您只会在重复和无答案的问题中弄乱。在这种情况下,关于分配新属性的观点也是毫无意义的。
保罗


18

就像以前所说的,我发现的最好最简单的方法是

var getPrintObject=function(object)
{
    return JSON.stringify(object);
}

这是最简单,最快的解决方案,但是不适用于大型对象navigator
someguy234 2014年


16

注意:在这些示例中,yourObj定义了要检查的对象。

首先,我最不喜欢但使用最多的显示对象的方式:

这是显示对象内容的实际方法

console.log(yourObj)

会产生类似: 在此处输入图片说明

我认为最好的解决方案是先查看“对象键”,然后查看“对象值”(如果您真的想查看对象的内容)...

console.log(Object.keys(yourObj));
console.log(Object.values(yourObj));

它将输出类似:( 在此处输入图片说明 如上图:存储在对象中的键/值)

如果您使用的是ECMAScript 2016或更高版本,则还有一个新选项:

Object.keys(yourObj).forEach(e => console.log(`key=${e}  value=${yourObj[e]}`));

这将产生整洁的输出: 在此处输入图片说明 上一个答案中提到的解决方案:console.log(yourObj)显示太多参数,并且不是显示所需数据的最人性化方式。这就是为什么我建议分别记录键和值的原因。

接下来:

console.table(yourObj)

有人在较早的评论中建议过这个,但是它对我没有用。如果它确实适用于其他浏览器或其他工具上的其他人,则表示荣誉!病态的代码仍然放在这里供参考!将这样输出到控制台: 在此处输入图片说明


您是否将示例扩展为包括Object和obj。
historystamp

不确定我是否理解注释,但是我为应该有名称的对象添加了不同的名称。对象不够明确。
马克斯·亚历山大·汉纳

console.table(yourObj) 在Google Chrome版本77.0.3865.90(正式版)(64位)上为我工作。感谢分享!
Devner,

15

(这已添加到我在GitHub上的库中)

在这里重新发明轮子!这些解决方案都不适合我的情况。因此,我很快就确定了wilsonpage的答案。这不是用于打印到屏幕上(通过控制台,文本字段或其他方式)。在这些情况下,它确实可以正常运行,并且可以按照OP的要求正常运行alert。此处的许多答案未按alert要求的OP 解决。无论如何,它是为数据传输而格式化的。此版本似乎返回与十分相似的结果toSource()。我尚未针对进行测试JSON.stringify,但我认为这是差不多的事情。这个版本更像是一个poly-fil,因此您可以在任何环境中使用它。该函数的结果是有效的Javascript对象声明。

我毫不怀疑这样的事情是否已经在某处出现了,但是比花一些时间搜索过去的答案要短得多。既然这个问题是我开始搜索时在Google上的热门话题;我想把它放在这里可能会帮助其他人。

无论如何,此函数的结果将是对象的字符串表示形式,即使您的对象具有嵌入式对象和数组,即使这些对象或数组具有甚至更多的嵌入式对象和数组也是如此。(我听说您喜欢喝酒吗?所以,我用一个凉爽的汽车拉皮箱。然后,我用一个凉爽的空调器拉皮箱。这样,您的凉爽的冰箱可以在凉爽的同时喝酒。)

数组使用[]而不是存储,{}因此没有键/值对,只有值。像常规数组一样。因此,它们像数组一样被创建。

另外,所有字符串(包括键名)都用引号引起来,除非这些字符串具有特殊字符(例如空格或斜杠),否则没有必要。但是,我不想检测到此问题只是为了删除一些本来可以正常工作的报价。

然后,可以将生成的字符串与字符串一起使用,eval或者直接将其转储到var中。因此,根据文本重新创建对象。

function ObjToSource(o){
    if (!o) return 'null';
    var k="",na=typeof(o.length)=="undefined"?1:0,str="";
    for(var p in o){
        if (na) k = "'"+p+ "':";
        if (typeof o[p] == "string") str += k + "'" + o[p]+"',";
        else if (typeof o[p] == "object") str += k + ObjToSource(o[p])+",";
        else str += k + o[p] + ",";
    }
    if (na) return "{"+str.slice(0,-1)+"}";
    else return "["+str.slice(0,-1)+"]";
}

让我知道是否将其弄乱了,在测试中效果很好。另外,我想到的唯一检测类型的方法array是检查是否存在length。因为Javascript实际上将数组存储为对象,所以我实际上无法检查类型array(没有这样的类型!)。如果其他人知道更好的方法,我很想听听。因为,如果您的对象还具有一个名为的属性,length则此函数将错误地将其视为数组。

编辑:添加了对空值对象的检查。谢谢布罗克·亚当斯

编辑:下面是固定的功能,能够打印无限递归的对象。这toSource与FF的打印效果不同,因为toSource它将打印一次无限递归,而该函数将立即终止它。此函数的运行速度比上面的函数慢,因此我将其添加到此处而不是编辑上面的函数,因为只有在您计划将链接到自身的对象传递到某个地方时,才需要此函数。

const ObjToSource=(o)=> {
    if (!o) return null;
    let str="",na=0,k,p;
    if (typeof(o) == "object") {
        if (!ObjToSource.check) ObjToSource.check = new Array();
        for (k=ObjToSource.check.length;na<k;na++) if (ObjToSource.check[na]==o) return '{}';
        ObjToSource.check.push(o);
    }
    k="",na=typeof(o.length)=="undefined"?1:0;
    for(p in o){
        if (na) k = "'"+p+"':";
        if (typeof o[p] == "string") str += k+"'"+o[p]+"',";
        else if (typeof o[p] == "object") str += k+ObjToSource(o[p])+",";
        else str += k+o[p]+",";
    }
    if (typeof(o) == "object") ObjToSource.check.pop();
    if (na) return "{"+str.slice(0,-1)+"}";
    else return "["+str.slice(0,-1)+"]";
}

测试:

var test1 = new Object();
test1.foo = 1;
test1.bar = 2;

var testobject = new Object();
testobject.run = 1;
testobject.fast = null;
testobject.loop = testobject;
testobject.dup = test1;

console.log(ObjToSource(testobject));
console.log(testobject.toSource());

结果:

{'run':1,'fast':null,'loop':{},'dup':{'foo':1,'bar':2}}
({run:1, fast:null, loop:{run:1, fast:null, loop:{}, dup:{foo:1, bar:2}}, dup:{foo:1, bar:2}})

注意:尝试打印document.body是一个可怕的例子。例如,FF在使用时仅打印一个空的对象字符串toSource。并且当使用上述功能时,FF在上崩溃SecurityError: The operation is insecure.。Chrome将会崩溃Uncaught RangeError: Maximum call stack size exceeded。显然,document.body这并不意味着要转换为字符串。因为它要么太大,要么违反安全策略来访问某些属性。除非,我在这里弄乱了,一定要告诉!


容易崩溃。ObjToSource(document.body)例如,尝试。
布罗克·亚当斯

好的,我发现了问题。我没有检查空值对象。现在已解决。但是,ObjToSource(document.body)由于无限递归,您仍然做不到。即使document.body.toSource()在FireFox中,也会返回一个空对象。
Pimp Trizkit 2012年

@BrockAdams-现在已对其进行了无限递归修复,但是document.body仍然无法打印。看注释。
皮条客Trizkit

document.body只是指出一些大问题的捷径。您现在已经解决了最糟糕的情况,而我已经投票赞成。(尽管我确实相信可以使用其他方法document.body。这里的大多数答案也不能很好地解决这个问题。)
布罗克·亚当斯

好吧,如果您(或其他任何人)对如何克服这样的事实有任何想法,那么在递归或绕过安全性限制期间,这么大的对象将填满堆栈。我很想听听。感谢您的投票!
皮条客Trizkit

14

如果您想打印其全长的对象,可以使用

console.log(require('util')。inspect(obj,{showHidden:false,depth:null})

如果要通过将对象转换为字符串来打印对象,则

console.log(JSON.stringify(obj));


JSON.stringify当您尝试与字符串对象连接时,需要添加。如果使用console.log(object),它应该漂亮地打印对象的内容
Satadru Biswas


11

我需要一种递归打印对象的方法,pagewil的答案提供了该对象(谢谢!)。我对其进行了一些更新,以包括一种打印到特定级别的方法,并增加间距,以便根据我们所处的当前级别正确缩进,以使其更具可读性。

// Recursive print of object
var print = function( o, maxLevel, level ) {
    if ( typeof level == "undefined" ) {
        level = 0;
    }
    if ( typeof level == "undefined" ) {
        maxLevel = 0;
    }

    var str = '';
    // Remove this if you don't want the pre tag, but make sure to remove
    // the close pre tag on the bottom as well
    if ( level == 0 ) {
        str = '<pre>';
    }

    var levelStr = '';
    for ( var x = 0; x < level; x++ ) {
        levelStr += '    ';
    }

    if ( maxLevel != 0 && level >= maxLevel ) {
        str += levelStr + '...</br>';
        return str;
    }

    for ( var p in o ) {
        if ( typeof o[p] == 'string' ) {
            str += levelStr +
                p + ': ' + o[p] + ' </br>';
        } else {
            str += levelStr +
                p + ': { </br>' + print( o[p], maxLevel, level + 1 ) + levelStr + '}</br>';
        }
    }

    // Remove this if you don't want the pre tag, but make sure to remove
    // the open pre tag on the top as well
    if ( level == 0 ) {
        str += '</pre>';
    }
    return str;
};

用法:

var pagewilsObject = {
    name: 'Wilson Page',
    contact: {
        email: 'wilson@hotmail.com',
        tel: '123456789'
    }  
}

// Recursive of whole object
$('body').append( print(pagewilsObject) ); 

// Recursive of myObject up to 1 level, will only show name 
// and that there is a contact object
$('body').append( print(pagewilsObject, 1) ); 

需要工作。有遗漏逗号,引号等
posfan12

6

我总是用console.log("object will be: ", obj, obj1)。这样,我不需要使用JSON进行字符串化。该对象的所有属性将很好地扩展。


6

在控制台内显示对象的另一种方法是使用JSON.stringify。查看以下示例:

var gandalf = {
  "real name": "Gandalf",
  "age (est)": 11000,
  "race": "Maia",
  "haveRetirementPlan": true,
  "aliases": [
    "Greyhame",
    "Stormcrow",
    "Mithrandir",
    "Gandalf the Grey",
    "Gandalf the White"
  ]
};
//to console log object, we cannot use console.log("Object gandalf: " + gandalf);
console.log("Object gandalf: ");
//this will show object gandalf ONLY in Google Chrome NOT in IE
console.log(gandalf);
//this will show object gandalf IN ALL BROWSERS!
console.log(JSON.stringify(gandalf));
//this will show object gandalf IN ALL BROWSERS! with beautiful indent
console.log(JSON.stringify(gandalf, null, 4));

5

Javascript功能

<script type="text/javascript">
    function print_r(theObj){ 
       if(theObj.constructor == Array || theObj.constructor == Object){ 
          document.write("<ul>") 
          for(var p in theObj){ 
             if(theObj[p].constructor == Array || theObj[p].constructor == Object){ 
                document.write("<li>["+p+"] => "+typeof(theObj)+"</li>"); 
                document.write("<ul>") 
                print_r(theObj[p]); 
                document.write("</ul>") 
             } else { 
                document.write("<li>["+p+"] => "+theObj[p]+"</li>"); 
             } 
          } 
          document.write("</ul>") 
       } 
    } 
</script>

打印对象

<script type="text/javascript">
print_r(JAVACRIPT_ARRAY_OR_OBJECT);
</script> 

通过Java中的print_r


我不确定这是否是我正在使用的js.do示例中的错误,但这似乎仅输出树的第一个完整“分支”。即,它遵循第一个参考文献的第一个参考文献...无穷大
Jon Story

5
var list = function(object) {
   for(var key in object) {
     console.log(key);
   }
}

object你的对象在哪里

或者您可以在chrome开发工具的“控制台”标签中使用此标签:

console.log(object);


我认为您的答案不完整。(不是我的原因downvote)这一点,但是,仅打印键..
Abdillah

1
感谢您的回答,这启发了我去做:console.log(Object.keys(object));虽然我知道只打印属性键,但对我来说已经足够了;)
Wilson

5

假设对象 obj = {0:'John', 1:'Foo', 2:'Bar'}

打印对象的内容

for (var i in obj){
    console.log(obj[i], i);
}

控制台输出(Chrome DevTools):

John 0
Foo 1
Bar 2

希望有帮助!


4

我更喜欢使用它console.table来获取清晰的对象格式,因此,假设您有这个对象:

const obj = {name: 'Alireza', family: 'Dezfoolian', gender: 'male', netWorth: "$0"};

您将看到如下所示的整洁易读的表格: 控制台表


3

我经常在项目中使用的一个辅助功能,用于通过控制台进行简单,快速的调试。灵感来自Laravel。

/**
 * @param variable mixed  The var to log to the console
 * @param varName string  Optional, will appear as a label before the var
 */
function dd(variable, varName) {
    var varNameOutput;

    varName = varName || '';
    varNameOutput = varName ? varName + ':' : '';

    console.warn(varNameOutput, variable, ' (' + (typeof variable) + ')');
}

用法

dd(123.55); 输出:
在此处输入图片说明

var obj = {field1: 'xyz', field2: 2016};
dd(obj, 'My Cool Obj'); 

在此处输入图片说明


3

您还可以使用ES6模板文字概念以字符串格式显示JavaScript对象的内容。

alert(`${JSON.stringify(obj)}`);

const obj  = {
  "name" : "John Doe",
  "habbits": "Nothing",
};
alert(`${JSON.stringify(obj)}`);


2

我使用了pagewil的打印方法,并且效果很好。

这是我的略微扩展版本,带有(草率的)缩进和不同的prop / ob分隔符:

var print = function(obj, delp, delo, ind){
    delp = delp!=null ? delp : "\t"; // property delimeter
    delo = delo!=null ? delo : "\n"; // object delimeter
    ind = ind!=null ? ind : " "; // indent; ind+ind geometric addition not great for deep objects
    var str='';

    for(var prop in obj){
        if(typeof obj[prop] == 'string' || typeof obj[prop] == 'number'){
          var q = typeof obj[prop] == 'string' ? "" : ""; // make this "'" to quote strings
          str += ind + prop + ': ' + q + obj[prop] + q + '; ' + delp;
        }else{
          str += ind + prop + ': {'+ delp + print(obj[prop],delp,delo,ind+ind) + ind + '}' + delo;
        }
    }
    return str;
};

这很草率。
posfan12

2

pagewils代码的另一种修改...他除了字符串以外不打印其他任何内容,并将数字和布尔字段留空,我将第二个typeof的错字固定在megaboss创建的函数中。

var print = function( o, maxLevel, level )
{
    if ( typeof level == "undefined" )
    {
        level = 0;
    }
    if ( typeof maxlevel == "undefined" )
    {
        maxLevel = 0;
    }

    var str = '';
    // Remove this if you don't want the pre tag, but make sure to remove
    // the close pre tag on the bottom as well
    if ( level == 0 )
    {
        str = '<pre>';   // can also be <pre>
    }

    var levelStr = '<br>';
    for ( var x = 0; x < level; x++ )
    {
        levelStr += '    ';   // all those spaces only work with <pre>
    }

    if ( maxLevel != 0 && level >= maxLevel )
    {
        str += levelStr + '...<br>';
        return str;
    }

    for ( var p in o )
    {
        switch(typeof o[p])
        {
          case 'string':
          case 'number':    // .tostring() gets automatically applied
          case 'boolean':   // ditto
            str += levelStr + p + ': ' + o[p] + ' <br>';
            break;

          case 'object':    // this is where we become recursive
          default:
            str += levelStr + p + ': [ <br>' + print( o[p], maxLevel, level + 1 ) + levelStr + ']</br>';
            break;
        }
    }

    // Remove this if you don't want the pre tag, but make sure to remove
    // the open pre tag on the top as well
    if ( level == 0 )
    {
        str += '</pre>';   // also can be </pre>
    }
    return str;
};

2

这是功能。

function printObj(obj) {
console.log((function traverse(tab, obj) {
    let str = "";
    if(typeof obj !== 'object') {
        return obj + ',';
    }
    if(Array.isArray(obj)) {            
        return '[' + obj.map(o=>JSON.stringify(o)).join(',') + ']' + ',';
    }
    str = str + '{\n';
    for(var p in obj) {
        str = str + tab + ' ' + p + ' : ' + traverse(tab+' ', obj[p]) +'\n';
    }
    str = str.slice(0,-2) + str.slice(-1);                
    str = str + tab + '},';
    return str;
}('',obj).slice(0,-1)))};

它可以使用带有可读性的制表符缩进来显示对象。


肯定的镜头使您的浏览器崩溃了:P
Satadru Biswas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.