console.log()控制台异步打印与对象展开后不一致问题

问题描述:

js 复制代码
console.log('baseData', baseData);
console.log('metrics', metrics);
normalizeMetricNulls(baseData, metrics);

上述代码中normalizeMetricNulls这个函数的作用是将bastData中属性值为null的字段修改为0,但是我发现我在这个函数的前面输出了baseData的值,其中的字段值已经是0,按理说还没有修改,应该是null,如下图所示:

解答:

我询问了AI,其给我的解答是:

❗️ Chrome 控制台对对象是按引用显示的(展开时会显示对象的"当前"状态),所以即便你在调用前用 console.log 打印了对象,之后如果对该对象做了修改(比如 normalizeMetricNulls),在控制台展开时会看到修改后的值(看起来像"先打印后修改也显示修改后")。

同时我也得到了解决办法,快照打印,对对象立即序列化,避免引用问题:

js 复制代码
console.log('baseData snapshot', JSON.parse(JSON.stringify(baseData)));
console.log('metrics snapshot', JSON.parse(JSON.stringify(metrics)));
normalizeMetricNulls(baseData, metrics);

其实我这个例子不能说明什么展开前的值和展开后的值的区别,因为我的图片中在控制台展开前的值显示的是省略号,所以我在网上搜到相关的更直白的例子:

(图中riskId展开前后的值不一致!)

❗️ 另一种解决办法就是调试对象的时候,使用debugger来调试效果更好。

参考文章:
前端 - 这个情况是因为什么?控制台输出的对象,在展开和折叠时数据不对等?

什么?console.log打印出的数据竟然不对?都怪我年轻不懂事,调试代码只会用console.log。

附录:

我还尝试了赋值和浅拷贝之后进行打印:

js 复制代码
//赋值
let b = baseData,m = metrics;
console.log('baseData snapshot', b);
console.log('metrics snapshot', m);
//浅拷贝
let b = Object.assign([], baseData), m = Object.assign([], metrics);
console.log('baseData snapshot', b);
console.log('metrics snapshot', m);

以上两种方法都以失败告终,究其原因:

  • 赋值依然引用的同一个对象。
  • 浅拷贝则是当对象只有一级属性为深拷贝;当对象中有多级属性时,二级属性后就是浅拷贝。

赋值,深浅拷贝问题可参考:全排列-遇到的深浅拷贝问题

相关推荐
柳杉19 分钟前
从数字化到数智化:3D 可视化大屏的下一个五年
前端·ai编程·数据可视化
zimoyin1 小时前
在 C# 里嵌入 JavaScript:用 Jint 做可热更新的自动化脚本(从入门到踩坑)
javascript·c#·自动化
风骏时光牛马1 小时前
从零到实战:AI全栈学习进阶路线
前端
FRing031 小时前
JavaScript入门到精通二十六(变量提升、函数剩余参数、展开运算符、ES6箭头函数)
开发语言·前端·javascript·es6·箭头函数
用户360055579001 小时前
Kestrel_VLLM - 15 · decode 优化四连击:19ms → 8ms
前端
IT_陈寒2 小时前
JavaScript的闭包陷阱,这个坑我躺了三天才爬出来
前端·人工智能·后端
计算机魔术师2 小时前
Microsoft Research 与合作者证明 31 年历史的 KLS 猜想
前端
weixin_417396832 小时前
桌面云终端PXE启动失败怎么排查?从DHCP Option到镜像下发
开发语言·前端·php·技术·酒店·综合布线·弱电
OpsEye3 小时前
怎么实现大模型的按用户、按应用配额限流?
javascript·ai编程
林恒smileZAZ3 小时前
浏览器为什么加载不了超大图片
前端·vue.js·html5