控制台打印空数组展开有数据??

821 阅读1分钟

问题复现

今天前端的一个小伙伴遇到了一个问题,请我帮忙解决一下,因为上午没有找到原因,下午复现了一下,他的代码大致是这样的

<button @click="sayArr">修改信息</button>
      function test() {
          let a = [];
          setInterval(() => {
              a[0] = '11';
              a[1] = 12;
              a[2] = 10;
              console.log('执行定时器');
          }, 1000);
          return a;
      }
      let arr = reactive({
          a:[]
      })
      function sayArr() {
          arr.a = test();
          console.log(a,'获取a值');
          console.log('arr',arr.a);
      }

在一个方法中写定时器,定时器中给数组赋值,然后方法返回这个数组。在另外的地方调用,这时问题出现了!! 首先点击一次按钮没有获取到a的值,这个能理解,因为定时器是在一秒之后执行的,先执行了赋值操作,此时a还是空的;如下图:

image.png 但是神奇的是,展开这个空数组,里面居然有值诶,奇了怪了。。

image.png

解密

为什么控制台打印是空数组展开确有数据?

在打印数组的时候,如果不展开,显示值为当前值,展开之后,会去重新到内存中读值,数组为引用类型,是传址而不是传值,浏览器从内存中实时读取到了数组里面的值,也可以说展开的值会是最终值。