当前位置: 首页 > 后端技术 > Node.js

面试热点问题:console.log()是同步的还是异步的?

时间:2023-04-03 22:39:01 Node.js

序言极尽倾注,深陷其中,界限分明。分享的文章纯属个人观点。如果有不准确的地方或者需要讨论的地方,欢迎大家评论交流,和同学一起学习~欢迎关注“前端进阶”步圈’公众号,一起探索学习前端技术。..公众号回复加群或扫码,即可加入前端交流学习群,长期交流学习。。公众号回复加好友,即可加为好友。面试热点:console.log()是同步还是异步?例如:vara={index:1,};//thenconsole.log(a);//thena.index++;以上代码在开发者工具控制台和浏览器控制台的输出:开发者工具控制台扩展前浏览器控制台:扩展后问:为什么会出现这个异常输出?R:我个人认为开发者工具控制台和浏览器控制台的输出结果不同,主要是类型的不同。js中的对象是引用类型,每次使用一个对象时,只使用该对象在堆内存中的引用。上述代码中,修改a.index++后,a在堆内存中的索引值变成了2。在不展开的时候,console.log()打印的是当时对象的快照,所以我们看到的索引值是1修改前。在展开对象的时候,实际上是再次从堆内存中读取对象的属性值,所以展开对象后看到的索引值为2。在《你不知道的javascript中卷》书中,Part2AsyncandPerformance->Chapter1Async:Now和未来->涵盖异步控制台:没有规范或要求集指定`console.*methodfamily`如何工作-它们不是JavaScript的正式部分,但由主机环境添加到JavaScript(参见“本书的类型和语法”部分)。因此,不同的浏览器和JavaScript环境可以做他们想做的事,这有时会让人感到困惑,尤其是在某些情况下某些浏览器的console.log(..)不会立即输出传入的内容。这样做的主要原因是在很多程序中(不仅仅是JavaScript),I/O是一个非常慢的阻塞部分。因此,(从页面/UI的角度来看)浏览器可以通过在后台异步处理控制台I/O来提高性能,而用户甚至可能没有意识到它正在发生。以下场景不是很常见,但可能会发生,从中可以观察到(不是从代码本身而是从外部):vara={index:1,};//thenconsole.log(a);console.log(a.index);//那么a.index+=1;我们通常认为console.log(..)语句刚执行时,会看到a对象的快照,打印类似{index:1}的东西,然后在下一条语句a.index++时修改被执行了,这句话的执行会严格在a的输出之后。在大多数情况下,上述代码在开发者工具控制台输出的对象表示是符合预期的。但是,当这段代码运行时,浏览器可能认为它需要将控制台I/O延迟到后台。这种情况下,当浏览器控制台输出对象内容时,a.index++可能已经执行完毕,所以会显示{index:2}。究竟什么时候控制台I/O会被延迟,或者即使它甚至是可观察到的,也有待商榷。如果在调试期间遇到在console.log(..)语句之后修改的对象并且看到意外结果,请注意这可能是由于此I/O的异步性质所致。书中建议:如果遇到这种罕见情况,最好的办法是在JavaScript调试器中使用断点,而不是依赖控制台输出。一个次优的解决方案是将对象序列化为一个字符串以强制执行“快照”,例如通过JSON.stringify(..)。总结:综上所述,console.log()打印的内容不能100%可靠,但对于Number、String、Boolean、Null、Undefined的打印内容通常是可靠的,但是对于Object等引用类型,会出现以上异常打印。建议:对于一般的基础类调试,使用console.log()是没有问题的。但是在调试对象的时候,还是使用断点(debugger)来调试的比较好。回答问题,个人认为console.log()在Number、String、Boolean、Null、Undefined类型上是同步的,但是在Object等引用类型上不好判断。也欢迎大家在评论区讨论~文章特殊字符描述:问号Q(问题)答案标记R(结果)注意事项标准:A:(注意事项)详细描述标记:D:(详细信息)摘要标记:S:(summary)分析注解:Ana:(analysis)提示注解:T:(tips)过往回顾:热门面试题:process系列题?热门面试题:Node.js中的垃圾回收?面试热点问题:http3.0~http1.0有哪些改进?JavaScript中的AMD和CMD规范Vue数据监控Object.definedProperty()方法的实现最后:欢迎来到“前端进阶圈”公众号,一起来探索和学习前端技术吧...公众号回复补充群或扫描二维码,可以加入前端交流学习群,长期交流学习...公众号回复加好友,即可加为好友