问题复现
今天前端的一个小伙伴遇到了一个问题,请我帮忙解决一下,因为上午没有找到原因,下午复现了一下,他的代码大致是这样的
<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还是空的;如下图:
但是神奇的是,展开这个空数组,里面居然有值诶,奇了怪了。。
解密
为什么控制台打印是空数组展开确有数据?
在打印数组的时候,如果不展开,显示值为当前值,展开之后,会去重新到内存中读值,数组为引用类型,是传址而不是传值,浏览器从内存中实时读取到了数组里面的值,也可以说展开的值会是最终值。