js的世界里面,大家还是会经常手动调试程序的。经常会使用console.log()来打印变量,如果要打印的变量是个普通字符串或者数字之类的,那么这里并不会有什么问题。但是,如果它是个复杂对象呢?是不是可能会得到一个[object]的提示信息呢?那么,本文就是针对这种问题,提出解决方案的。

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - console-dir
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-1)

大家好,这里是苏南大叔的“程序如此灵动”博客,这里介绍苏南大叔和计算机代码的故事。本文讲述在nodejs中打印一个对象变量。本文测试环境:win10node@16.14.2chrome@100.0.4896.60

问题描述

两种情况,浏览器 和 命令行。测试变量:
范例对象定义:

var obj = {
    name: "sunan大叔",
    blog: {
        "name": "程序如此灵动",
        "url":{
            www:"https://newsn.net",
            info:{
                protocol:"https:",
                "host":"newsn.net",
                "path":"/",
                "search":"?aaa",
            }
        }
    }
}

在浏览器的console里面,使用console.log()打印任何对象或者变量都是可以的。都可以通过点击左侧箭头的方式,剥丝抽茧。如下图所示:

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - 浏览器状况
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-2)

在纯正的nodejs环境下,使用console.log()打印一个普通变量的话,和浏览器里面的表现一致,可以获得想要的效果。但是,试图打印一个深度较大(>=3)的对象的时候,就完全是蒙圈了,会显示[object]的字样。

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - 基本状况
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-3)

那么,如何处理这种问题呢?

方案一【推荐】

console.log('%j', obj);

这个算最简单的推荐方案,就是个%j,注意只能是j,意思是json。不过这个方案非常显式的剥夺了.log()可以输出多个变量的功能。

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - 格式化
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-4)

方案二

console.log(JSON.stringify(obj))

这个方案的结果和上面的%j结果,没有什么区别。如果觉得可读性比较差,就可以试试下面的这个方案:

console.log(JSON.stringify(obj, null, 4));

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - json格式化版本
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-5)

参考文章:

方案三【推荐】

使用console.dir(),例如:

console.dir(obj, { depth: null });

这种情况和原始的只传入一个参数的.log()方案比较而言的话,就是解锁了depth参数。

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - 解锁depth参数
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-6)

参考文章:

方案四

这个方案里面,引入了默认自带的util包,略显复杂。不过核心思想还是解锁depth参数。

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

参考文章:

苏南大叔:nodejs调试,如何打印一个对象的细节内容?而不是[object] - 我是最棒的
nodejs调试,如何打印一个对象的细节内容?而不是[object](图7-7)

相关文章

综述

更多node的调试经验文章,请参考下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。