console.log()是异步还是同步?

111 阅读1分钟

今天在整理Object.assign()时出现一个有意思的现象

        let oT = {
            a: 1,
            arr: [1, 2, 3, 4]
        }
        let oT1 = Object.assign({}, oT);
        console.log(oT); //{a:1,arr:[999,2,3,4];
        console.log(oT1);//{a:1,arr:[999,2,3,4];
        oT.arr[0] = 999;
        console.log(oT1);//{a:1,arr:[999,2,3,4];

当时我看见这个输出就楞了,为什么输出的结果arr第一个元素怎么等于‘999’.我第一个想到是console.log()是不是异步操作。于是我又敲了几行代码

  let arr = [1,2,3,4];
  console.log(arr);//[1,2,3,4]
  arr[0]=999;
  console.log(arr);//[999,2,3,4]

这个输出结果就否认了console.log()不是异步输出。 对最前面的代码又进行了进一步的输出

        let oT = {
            a: 1,
            arr: [1, 2, 3, 4]
        }
        let oT1 = Object.assign({}, oT);
        console.log(oT); //{a:1,arr:[999,2,3,4];
        // 这样输出结果就是 1  
        console.log(oT.arr[0]);//1
        
        console.log(oT1);//{a:1,arr:[999,2,3,4];
        oT.arr[0] = 999;
        console.log(oT1);//{a:1,arr:[999,2,3,4];

这使得我很纳闷,我在node.js的环境下进行输出。结果是

 console.log(oT); //{a:1,arr:[1,2,3,4];

于是我感觉是不是浏览器本身的缺陷查了一下资料。 其实在 console.log 执行的时候,chrome 会对 log 的对象求一次值,打印出来是 Object ,可以继续展开的。但当你展开控制台中的 Object 的时候,chrome 又会对它求一次值,这一次是显示它的属性。所以才会有前后打印的东西不一样的情况发生,因为对象引用的实体的值改变了。 最后结论是浏览器自身的原因跟代码和JavaScript没有关系。 参考资料