今天遇到了一个奇怪的问题

image.png
可以看到图中,log同时打印这个对象和这个对象的一个属性,打印出的值却不相同!这是怎么哥回事呢?

排查问题原因

我当时就特别奇怪,这是为什么呢?这不都是同步的么?没有什么异步啊,怎么值就不一样呢?
接下来,你知道的,就开始排查原因,代码看了n遍,也没看出个所以然来!接下来就是各种查资料。也没有找到什么原因(毕竟查的资料和根本原因不同)。什么结果都没有查出来,很显然,也没有找到解决问题的办法。有点怀疑人生了。

找到原因

终于,找到问题原因。
最终还是一点一点的断点调试。结果发现,log居然不是同步的。当时的我无比的惊奇。
开始百度,log是同步的还是异步的。
结果发现,WebKit内核下,是异步的。在node.js中是绝对同步的。了解到这,不得不感叹,js真的是奇怪又强大啊!自己的js内功还是差了很多啊!以后多多补补,多多看书吧!

完美形容问题

image.png

总结

《JavaScript异步编程》书中是这么解释的:

WebKit的console.log并没有立即拍摄对象快照,相反,它只存储了一个指向对象的引用,然后在代码返回事件队列时才去拍摄快照。而chrome的内核正是webkit

Node的console.log是另一回事,它是严格同步的,因此同样的代码输出却是正确的

书中指出,JavaScript 环境提供的异步函数一般分为两大类:I/O函数和计时函数。console.log就是一个I/O函数。对于引用类型,console.log会先储存一个引用,因此在打印引用类型时结果不一定准确。

所以 console.log 到底是同步还是异步取决于运行环境。

如果能够帮助到你,是小编最大的荣幸

当然 有 不好的地方 请大家帮忙指出 学习永无止境

小编一直认为 人外有人 天外有天 一起学习 共同进步

让我们共同加油吧!!!