ChatGPT解决这个技术问题 Extra ChatGPT

如何显示 JavaScript 对象?

如何以字符串格式显示 JavaScript 对象的内容,例如当我们 alert 变量时?

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

你能改写你的问题吗? “格式化方式”是什么意思?如,具有丰富的格式,如粗体/斜体/等?
有没有办法通过使用一些控制台命令打印变量的值来显示变量的运行时值?
@BlackPanther 只需执行 console.log("", yourObject1, yourObject2, yourObject3, etc...);。一个较短的版本是只做 console.log(yourObject1, yourObject2, etc...);
您能否选择一个更准确地反映社区共识的更好答案?
一些提示:您可以使用颜色来更好地查看:console.log('%c Sample Text', 'color:green;');或者使用以下命令在文本中添加一些 VAR:console.log(`Sample ${variable}`, 'color:green;');

u
user229044

使用原生 JSON.stringify 方法。此方法适用于嵌套对象和所有主要浏览器support

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 Reference 和其他示例。

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

如果您遇到此 Javascript 错误,请使用自定义 JSON.stringify replacer

"Uncaught TypeError: Converting circular structure to JSON"

要获得更易读的输出,请尝试 JSON.stringify(obj, null, 4)。这将把它写成整齐的缩进文本
JSON.stringify 只能显示一小部分 javascript 值,其余部分会抛出异常——console.log 没有这个问题。
如果您像我一样是新手,请不要忘记console.logconsole.log(JSON.stringify(obj,null, 4));
当 ob=window 时出现“未捕获的 TypeError:将循环结构转换为 JSON”。
我遇到过它不起作用的情况:它显示 {} 表示非空对象。因此,在 strigify() 返回 {} 时认为您的对象为空之前,请务必检查 console.log(obj)
A
Audwin Oyong

如果要打印对象以进行调试,请使用以下代码:

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

将显示:

https://i.stack.imgur.com/x0Tvz.png

注意:您必须只记录对象。例如,这不起作用:

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

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

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

使用 JavaScript 控制台(Shift+Control+J 或 Shift+Control+I,取决于 Chrome 版本)时,该功能也适用于 Google Chrome。另请注意,console.log(obj1, obj2) 也非常有效,因此在记录多个变量时,您不必为每个对象调用 console.log()。此外,请始终记住在生产中删除所有此类调用,因为它会破坏未实现它的浏览器(例如 Internet Explorer)。
是的,它会打印 [object Object],但它旁边有一个小扩展切换按钮,可让您检查对象的内容。
@hughes 实际上两者都可以。我有一个我创建的对象: var obj = { "foo" : false };另一个从服务器传递到回调的对象,通过回调传递的对象带有小箭头,以便您可以打开它,静态创建的对象仅打印 [object Object] 没有箭头。我也在努力解决这个问题,还有其他想法吗?
console.log("id:"+obj); 不会正确输出,因为它会输出您在此处看到的字符串,您需要像这样指定它:console.log("id:"); console.log(obj);
试试 console.log(JSON.stringify(obj))console.dir(obj)
B
Ben McCann
var output = '';
for (var property in object) {
  output += property + ': ' + object[property]+'; ';
}
alert(output);

这正是我想要的。我正在使用谷歌地图 v3,方向渲染器返回一个对象。那有四个项目,其中一个对象名称不断变化,因此我们需要找到它。为此,这种方法确实有帮助。除此之外,我们还可以获得属性和对象的所有名称。或者有没有其他方法可以找到对象和属性的名称?
+1,并非所有 javascript 都在浏览器中运行或可以在其中调试。
大多数时候,您可能想用 hasOwnProperty 掩盖内置的杂物。
天哪——0:[; 1:○; 2:乙; 3:j; 4:e; 5:c; 6:吨; 7:; 8:O; 9:乙; 10:j; 11: e; 12:c; 13:吨; 14:];
发现这个有点晚了,但正如我去年(8 月 29 日)生日时要求的那样,这是一个工作小提琴。 jsfiddle.net/MrMarlow/fq53o6o9
R
Rob Bednark

console.dir(object)

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

请注意,console.dir() 功能是非标准的。请参阅MDN Web Docs


是的,这是一个很好的解决方案,但是如果您只想记录对象(例如,console.dir(obj)),它只能按预期工作。如果你想将一个字符串连接到输出,它会给你[object Object]。
console.dir 的一个巨大优势是,在变量被垃圾回收后,您仍然可以扩展和读取控制台中的值。这在另一个 SO article here
console.dir 的另一个优点是,当您将控制台保存到文件时,所有属性都按预期保存在文件中。仅使用 console.log 时不会发生这种情况。
A
Abhishek Goel

尝试这个 :

console.log(JSON.stringify(obj))

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


typeerror: Converting circular structure to JSON
@KaidenPrince 查看您的错误答案:stackoverflow.com/questions/4816099/… 它可能是您的对象中的一个 DOM 元素。如果是这种情况,您最好尝试在 chrome 或 firefox 中登录控制台并在那里进行检查。否则,您必须在调用 JSON.stringify 之前删除所有圆形元素才能使其工作。
解决方案是简单地拆分成 2 个单独的命令,信不信由你:console.log("id:");控制台.log(obj);
JSON.stringify 不理解 Map
r
rink.attendant.6

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

我猜这对于大多数调试目的来说已经足够了。


Object.toSource() 似乎不适用于 Chrome,这是预期的吗?还是 Chrome 不属于“高级浏览器”? =)
旧帖,刚通过谷歌找到的。 .toSource() 实际上是 only 的。只是想我会让你知道。
G
Garry

如果你想使用 alert 来打印你的对象,你可以这样做:

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

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


toSource() 在非 gecko 浏览器(例如 Chrome、Safari)中不起作用
V
Vlad Bezden

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

console.table(obj);

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

您还可以选择要显示的列:

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

您可以找到有关 console.table here 的更多信息


w
wilsonpage

功能:

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
@jsh,您应该转动 if-else 并检查对象而不是仅检查字符串。更新的小提琴:jsfiddle.net/6eqMn/594
@wilsonpage 如果我将整数值添加到 tel 属性,这将失败:(
A
Aliaksandr Sushkevich

在 NodeJS 中,您可以使用 util.inspect(obj) 打印对象。一定要说明深度,否则你只会得到物体的浅印。


R
Raza Rafaideen

只需使用

JSON.stringify(obj)

例子

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

或者

alert(args_string);

此外,javascript 函数中的注释被视为对象。

作为额外说明:

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

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

问题本身指出:“就像我们'警告'一个变量”,所以这不是一个真正的答案。而且您的另一个选项“JSON.stringify(obj)”已经在“2010 年 11 月 27 日”中提到,您只是用重复和非答案来混淆这个问题。在这种情况下,您关于分配新属性的观点也是毫无意义的。
M
Max Alexander Hanna

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

首先是我最不喜欢但最常用的显示对象的方式:

这是显示对象内容的事实上的方式

console.log(yourObj)

https://i.stack.imgur.com/Bxak7.png

我认为最好的解决方案是查看对象键,然后查看对象值,如果您真的想查看对象包含什么...

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

https://i.stack.imgur.com/aFpJc.png

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

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

https://i.stack.imgur.com/cz4DR.png

接下来:

console.table(yourObj)

https://i.stack.imgur.com/qPYhu.png


您能否扩展示例以包括 Object 和 obj。
不确定我是否理解评论,但我为应该有名称的对象添加了不同的名称。对象不够明确。
console.table(yourObj) 在 Google Chrome 版本 77.0.3865.90(官方版本)(64 位)上为我工作。感谢分享!
j
jpoppe

使用 Node.js 打印带有颜色的完整对象作为奖励:

console.dir(object, {depth: null, colors: true})

颜色当然是可选的,'depth: null' 将打印完整的对象。

浏览器似乎不支持这些选项。

参考:

https://developer.mozilla.org/en-US/docs/Web/API/Console/dir

https://nodejs.org/api/console.html#console_console_dir_obj_options


W
Walter Caraza

用这个:

console.log('print object: ' + JSON.stringify(session));

y
yonia

正如之前所说,我发现的最好和最简单的方法是

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

这是最简单、最快的解决方案,但它不适用于 navigator 等大对象。
A
Anton Harniakou

这是一种方法:

console.log("%o", obj);

有趣的。有这方面的更多信息吗?
在 Chrome-dev-tool 的上下文中,google 确实在此 link 中提到了这一点。参考“字符串替换和格式化”部分
我在 mdn docs 中看到了它。
如此被低估的答案,这正是我想要的。
我经常使用以下作为调试语句。 console.log("id-str %o",{obj1:obj1,obj2:obj2,...});调试窗口会识别每个对象,我可以深入了解那些有趣的对象。
P
Pimp Trizkit

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

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

我不会怀疑这样的东西是否已经在某个地方出现了,但是制作它比花一些时间搜索过去的答案要短。因为当我开始搜索这个问题时,这个问题是我在谷歌上的热门话题;我想把它放在这里可能会帮助其他人。

无论如何,这个函数的结果将是你的对象的字符串表示,即使你的对象有嵌入的对象和数组,即使这些对象或数组有更多的嵌入对象和数组。 (听说你喜欢喝酒?所以,我用冷却器拉了你的车。然后,我用冷却器拉了你的冷却器。所以,你的冷却器可以喝,而你很酷。)

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

此外,所有字符串(包括键名)都被引用,除非这些字符串具有特殊字符(如空格或斜杠),否则这不是必需的。但是,我不想检测这个只是为了删除一些否则仍然可以正常工作的引号。

然后,这个结果字符串可以与 eval 一起使用,或者只是将其转储到 var thru 字符串操作中。因此,从文本重新创建您的对象。

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 的属性,那么这个函数会错误地将它视为一个数组。

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

编辑:下面是能够打印无限递归对象的固定函数。这与 FF 中的 toSource 打印不同,因为 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)。甚至 FireFox 中的 document.body.toSource() 也会返回一个空对象。
@BrockAdams - 现在它固定为无限递归,但是 document.body 仍然不可打印。看注释。
document.body 只是指出一些大问题的捷径。你现在已经解决了最糟糕的问题,我已经投了赞成票。 (虽然,我确实相信另一种方法可以处理 document.body。这里的大多数答案也不会很好地反对它。)
好吧,如果您(或其他任何人)对如何克服这样一个大对象将在递归期间填满堆栈或绕过安全限制这一事实有任何想法。我很想听听。感谢投票!
s
sreepurna

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

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

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

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


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

我需要一种递归打印对象的方法,该对象提供了 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) ); 

R
Ritu

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

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

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


n
nils petersohn

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


S
Socrates

在控制台中显示对象的另一种方法是使用 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));

M
Mukesh Chapagain

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> 

通过print_r in Javascript


我不确定这是否是我正在使用的 js.do 示例中的错误,但这似乎只输出树的第一个完整“分支”。即它遵循第一个参考的第一个参考......无限期
u
user3632930
var list = function(object) {
   for(var key in object) {
     console.log(key);
   }
}

其中 object 是您的对象

或者您可以在 chrome 开发工具的“控制台”选项卡中使用它:

console.log(object);


我认为你的答案不完整。 (不是我导致downvote)这,然而,只打印密钥..
感谢您的回答,它启发了我这样做:console.log(Object.keys(object)); 虽然我知道只打印属性键,但对我来说就足够了;)
k
karlzafiris

假设对象 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

希望有帮助!


A
Alireza

我更喜欢使用 console.table 来获得清晰的对象格式,所以假设您有这个对象:

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

https://i.stack.imgur.com/31MFN.png


R
Rafael Xavier

如果您正在寻找 Node.js 的内联...

console.log("%o", object);

G
George Kagan

我总是在我的项目中使用一个小助手功能,通过控制台进行简单、快速的调试。灵感来自 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) + ')');
}

用法

https://i.stack.imgur.com/EZRQG.png

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

https://i.stack.imgur.com/EcNAs.png


S
Scott

console.log() 在调试对象方面做得很好,但是如果您希望将对象打印到页面内容,这是我想出的模仿 PHP 的 print_r() 功能的最简单方法。很多其他答案都想重新发明轮子,但是在 JavaScript 的 JSON.stringify() 和 HTML 的

 标记之间,你得到的正是你想要的。
                			                   			

var obj = { name: 'The Name', contact: { email: 'thename@gmail.com', tel: '123456789' }}; $('body').append('

'+JSON.stringify(obj, null, 4)+'
');


b
bitless

我使用了 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;
};

这是非常草率的。