浏览器端的 console.log 是借助渲染引擎实现的吗?并不是真正的“打印命令行”?

2018-07-13 17:38:16 +08:00
 abcbuzhiming
以前我一直以为,浏览器端的 console.log 是一个真的“同步输出命令行”。就和其它大部分语言一样,你给它什么值,它就立刻打印到屏幕上去。但是最近在开发中发现的一个 bug 引发的现象,让我产生了疑问:
这个 bug 是这样的,从服务器拿到的数据。服务器端打印的结果,和浏览器端最终的结果不一样,哪怕在浏览器端拿到数据后立即 console.log 输出,发现值也是和服务端给的不一样,研究了半天发现是在渲染代码里无意中少写了=号导致数据被改变了。但是有一点:console.log 可是在渲染代码之前就执行了的,然而输出到控制台上的数据却依旧是被篡改后的。这种现象的唯一解释是控制台其实是归浏览器的渲染引擎管的,就和渲染 DOM 是一条线,在 js 代码本身没执行完之前,console.log 并不会真正的输出内容。请问各位是不是这样?
5585 次点击
所在节点    JavaScript
26 条回复
autoxbc
2018-07-13 23:02:22 +08:00
引用对象和其原型链形成了一个十分巨大的树形结构,没有办法简单对其做快照,所以希望 console.log 输出引用类型的某一时刻状态是不现实的

夸张点说,每快照一次,需要保存整个引擎所在内存
lookas2001
2018-07-14 00:27:38 +08:00
输出对象的话是一个引用,然后查看的时候一步一步展开。这点就如 3 楼提示的那样。
如果输出一个数字一个字符串啥的就不会有这种问题。
想想都是泪,当时我也遇到过这样的情况,差错查了整整一天。(无奈)
royzxq
2018-07-14 00:45:16 +08:00
恭喜踩坑 1/?
wly19960911
2018-07-14 07:05:17 +08:00
如果真的想定位当前位置的值,用 debugger 或者 console.log 定位代码然后断点,console.log 出来的值,会异步读取,造成读值的偏差。
abcbuzhiming
2018-07-14 09:19:46 +08:00
@airdge 了解了,谢谢,天坑啊这是
msg7086
2018-07-14 18:00:54 +08:00
#15 其他语言里连打印对象功能都没有,当然也就没有这个现象了。
你想想,别的语言里是不是都是打印出字符串的?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/470685

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX