如何以字符串格式显示 JavaScript 对象的内容,例如当我们 alert
变量时?
我想显示对象的格式相同。
console.log("", yourObject1, yourObject2, yourObject3, etc...);
。一个较短的版本是只做 console.log(yourObject1, yourObject2, etc...);
。
使用原生 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"
如果要打印对象以进行调试,请使用以下代码:
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);
console.log(obj1, obj2)
也非常有效,因此在记录多个变量时,您不必为每个对象调用 console.log()
。此外,请始终记住在生产中删除所有此类调用,因为它会破坏未实现它的浏览器(例如 Internet Explorer)。
console.log("id:"+obj);
不会正确输出,因为它会输出您在此处看到的字符串,您需要像这样指定它:console.log("id:"); console.log(obj);
console.log(JSON.stringify(obj))
或 console.dir(obj)
var output = '';
for (var property in object) {
output += property + ': ' + object[property]+'; ';
}
alert(output);
console.dir(object)
:
显示指定 JavaScript 对象的属性的交互式列表。此列表允许您使用显示三角形来检查子对象的内容。
请注意,console.dir()
功能是非标准的。请参阅MDN Web Docs
console.dir
的一个巨大优势是,在变量被垃圾回收后,您仍然可以扩展和读取控制台中的值。这在另一个 SO article here
console.dir
的另一个优点是,当您将控制台保存到文件时,所有属性都按预期保存在文件中。仅使用 console.log 时不会发生这种情况。
尝试这个 :
console.log(JSON.stringify(obj))
这将打印对象的字符串化版本。因此,您将获得对象的内容,而不是 [object]
作为输出。
typeerror: Converting circular structure to JSON
?
好吧,Firefox(感谢@Bojangles 提供详细信息)具有将对象打印为 JSON 和 function(){}
的 Object.toSource()
方法。
我猜这对于大多数调试目的来说已经足够了。
.toSource()
实际上是 only 的。只是想我会让你知道。
如果你想使用 alert 来打印你的对象,你可以这样做:
alert("myObject is " + myObject.toSource());
它应该以字符串格式打印每个属性及其对应的值。
如果您想以表格格式查看数据,您可以使用
console.table(obj);
如果单击表格列,可以对表格进行排序。
您还可以选择要显示的列:
console.table(obj, ['firstName', 'lastName']);
您可以找到有关 console.table here 的更多信息
功能:
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/
只需使用
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);
注意:在这些示例中,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
console.table(yourObj)
在 Google Chrome 版本 77.0.3865.90(官方版本)(64 位)上为我工作。感谢分享!
使用 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
用这个:
console.log('print object: ' + JSON.stringify(session));
正如之前所说,我发现的最好和最简单的方法是
var getPrintObject=function(object)
{
return JSON.stringify(object);
}
navigator
等大对象。
(这已添加到我在 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()
也会返回一个空对象。
document.body
仍然不可打印。看注释。
document.body
只是指出一些大问题的捷径。你现在已经解决了最糟糕的问题,我已经投了赞成票。 (虽然,我确实相信另一种方法可以处理 document.body
。这里的大多数答案也不会很好地反对它。)
如果您想打印其全长的对象,可以使用
console.log(require('util').inspect(obj, {showHidden: false, depth: null})
如果要通过将对象转换为字符串来打印对象,则
console.log(JSON.stringify(obj));
JSON.stringify
。如果您使用 console.log(object)
,它应该会漂亮地打印对象的内容
我需要一种递归打印对象的方法,该对象提供了 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) );
您还可以使用 ES6 模板字面量概念以字符串格式显示 JavaScript 对象的内容。
alert(`${JSON.stringify(obj)}`);
const obj = { "name" : "John Doe", "habbits": "Nothing", };警报(`${JSON.stringify(obj)}`);
我总是使用 console.log("object will be: ", obj, obj1)
。这样我就不需要使用 JSON 进行字符串化的解决方法。对象的所有属性都将很好地扩展。
在控制台中显示对象的另一种方法是使用 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));
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>
var list = function(object) {
for(var key in object) {
console.log(key);
}
}
其中 object
是您的对象
或者您可以在 chrome 开发工具的“控制台”选项卡中使用它:
console.log(object);
console.log(Object.keys(object));
虽然我知道只打印属性键,但对我来说就足够了;)
假设对象 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
希望有帮助!
我更喜欢使用 console.table
来获得清晰的对象格式,所以假设您有这个对象:
const obj = {name: 'Alireza', family: 'Dezfoolian', gender: 'male', netWorth: "$0"};
https://i.stack.imgur.com/31MFN.png
如果您正在寻找 Node.js 的内联...
console.log("%o", object);
我总是在我的项目中使用一个小助手功能,通过控制台进行简单、快速的调试。灵感来自 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
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)+'');
我使用了 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;
};
不定期副业成功案例分享
console.log
即console.log(JSON.stringify(obj,null, 4));
{}
表示非空对象。因此,在strigify()
返回{}
时认为您的对象为空之前,请务必检查console.log(obj)
。