踩坑小记——薛定谔的 Console.log()


在写作本文时我已经理清了思路,但在当时走投无路、无计可施的情况下难免会忽略一些细节。复现问题时使用的是简单的例子,表现意思即可,故在此无需探讨例子的意义

今天写代码时,调试一个数组对象,想把内容都打印出来,就直接 console.log(),把三角形展开,如下:

可以看到,0:1: 对应的值都不是数组 [] 中的值,01 是数组的索引值,从 0 开始,没问题,但是为何对应的值不匹配呢?

在调试时,类似 (2) [22, 2] 行输出的是二维数组,因此输出不能一目了然,我认为没有预期输出是代码问题,因此审视了一遍代码,严格理了一遍逻辑发现并没有错误 ,除了一些小 Bug

走投无路时,发现有如下 ! 的标记:

鼠标悬停,弹出如下提示:

意识到可能这里存在“未解之谜”,Bing 之后,发现果然存在玄机:记一次"Value below was evaluated just now"

我还是太年轻,012……输出的不是数组的值,而是最终改变的值,因此,在运行时展开,此时的值是展开那个时间点的值,就像封面图一样:

当你在控制台展开打印出来的数组(或者对象)的时候,如果此时数组(或者对象)的数据已经发生了改变,那么将显示改变之后的数据。如果此时数组(或者对象)的数据没有发生改变,那么就一直显示此时的数据

这个值不是固定的,而是视展开时的情况而定,就像电子双缝干涉实验所表现出来的,有无观察者会对结果产生影响

Tomcat


文章作者: Palm Civet
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Palm Civet !
  目录