chrome 的控制台处于性能的考虑,对应引用类型的数据读取是存在延迟的,默认值读取一层数据,当你点击展开时,会重新去堆内存中读取属性值和下一层的数据。
这种优化,有时候会给我们一种错觉,console.log 是异步的。
问:console.log 是同步还是异步的。
答:同步的。
1.打印数组的时候
在console.log的运行中,如果将对象放进数组中,会出现延迟打印的情况
let aa = {
num: 10
}
let ac = []
ac[0] = aa;
console.log(ac);
aa.num = 100;
console.log(ac);
在上面的例子中,同样打印ac数组,但是第一个里的数组对象却是进行赋值以后的结果,也就是说第一个数组ac和进行赋值后的数组ac打印相同
其实这是console.log的问题,发生了延迟打印,这两个ac打印的是同一个ac,都是进行计算以后的值,但是程序执行过程中还是从上往下运行,将打印ac改成打印ac.aa就能看出来
下面这个例子也是这样
function a() {
}
a.prototype.n = 1;
console.log(a);
var b = new a();
console.log(b.n)
a.prototype.n = 2;
console.log(b.n)
console.log(a);
在n=1第一次赋值以后进行console.log打印,
会发现原型的结果和第二次赋值以后的结果一样
.两次打印a对象,里面指向的原型对象都是n=2,明明n=2的赋值在下面,结果第一打印还是出现了n=2,而不是1
这就是延时打印,是运行以后的结果,因为谷歌在浏览器性能的考虑,只有在你展开的时候才会去获取数据,结果就是第二次赋值运行以后的数据