Node.js向对象内数组推送元素后控制台显示[Array]问题
问题原因
这个现象是Node.js内置console.log的输出优化机制导致的,和你代码本身的逻辑完全无关,内存里的对象结构是完全正确的。
Node.js在直接输出JS对象/数组时,默认只会展开嵌套深度≤2层的内容,超过这个深度的嵌套结构会被折叠显示:
- 数组会被展示为
[Array] - 普通对象会被展示为
[Object]
你代码里的relays数组嵌套层级是x[0].devices.relays,深度为3层,刚好超过默认的展开阈值,所以就被折叠了。
而JSON.stringify()会把整个对象序列化为完整的JSON字符串,不会受控制台输出深度的限制,所以能看到完整结构。
解决方法
如果你想直接用console.log输出完整的嵌套对象,可以用以下几种方式:
- 使用
console.dir并指定展开深度
// depth设为null会展开所有层级的嵌套 console.dir(x, { depth: null })
- 手动把对象转成格式化的JSON输出
// 第三个参数为缩进空格数,输出的格式可读性更高 console.log(JSON.stringify(x, null, 2))
- (不推荐全局修改)修改Node.js控制台默认展开深度
require('util').inspect.defaultOptions.depth = null
额外说明
你开发REST API不需要担心这个问题,Express、Koa等主流Node.js后端框架在返回JS对象给客户端时,会自动完成完整的JSON序列化,客户端收到的会是包含完整relays结构的正常数据,不会出现折叠的情况。
内容的提问来源于stack exchange,提问作者Tushar Hasan
相关产品推荐
相关产品推荐

