在写作本文时我已经理清了思路,但在当时走投无路、无计可施的情况下难免会忽略一些细节。复现问题时使用的是简单的例子,表现意思即可,故在此无需探讨例子的意义
今天写代码时,调试一个数组对象,想把内容都打印出来,就直接 console.log()
,把三角形展开,如下:
可以看到,0:
和 1:
对应的值都不是数组 []
中的值,0
和 1
是数组的索引值,从 0
开始,没问题,但是为何对应的值不匹配呢?
在调试时,类似 (2) [22, 2]
行输出的是二维数组,因此输出不能一目了然,我认为没有预期输出是代码问题,因此审视了一遍代码,严格理了一遍逻辑发现并没有错误 ,除了一些小 Bug
走投无路时,发现有如下 !
的标记:
鼠标悬停,弹出如下提示:
意识到可能这里存在“未解之谜”,Bing 之后,发现果然存在玄机:记一次"Value below was evaluated just now"
我还是太年轻,0
、1
、2
……输出的不是数组的值,而是最终改变的值,因此,在运行时展开,此时的值是展开那个时间点的值,就像封面图一样:
当你在控制台展开打印出来的数组(或者对象)的时候,如果此时数组(或者对象)的数据已经发生了改变,那么将显示改变之后的数据。如果此时数组(或者对象)的数据没有发生改变,那么就一直显示此时的数据
这个值不是固定的,而是视展开时的情况而定,就像电子双缝干涉实验所表现出来的,有无观察者会对结果产生影响