Node中console.log到底是异步还是同步的

打开Chrome谷歌浏览器的DevTool,在Console标签中输入如下代码,却发现输出的结果跟展开输出的结果是不一样的.

那么console.log到底是异步还是同步的?

这里先给出浏览器环境下出现上述情况的原因。
在浏览器环境中直接输出的结果是同步,什么时候输出就输出那个时候的结果。
但是展开输出的结果却是异步的,这种是未来跟输出的结果交互的情况。因为我们是在输出结果,在点击展开的,这时候展开输出的结果是引用那个arr数组,点击展开后,arr数组已经完成改变。

Node.js中的console.log

那么在Node.js环境中console.log的执行是异步还是同步的呢?
我们首先要知道Node.js中实现console.log的原理

function log() {
process.stdout.write(
util.format.apply(this, arguments);
)
}

那么这篇文章就等同于问process.stdout.write是同步还是异步的?
其实官方文档已经给出了答案,A note on process I/O
process.stdout和process.stderr是根据系统环境来判定的同步还是异步的

  • Files: synchronous on Windows and Linux
  • TTYs (Terminals): asynchronous on Windows, synchronous on Unix
  • Pipes (and sockets): synchronous on Windows, asynchronous on Unix

那么console.log也是根据系统环境来判定同步还是异步的。
那么这个同步还是异步对我们程序有影响吗?
我们知道同步写入阻止事件循环,直到写入完成为止。这可以在输出到一个文件的情况下这几乎是瞬间完成的,但系统高负载下,比如管道不是在接收末端读取,或缓慢的终端或文件系统,其可能的事件循环受阻的次数足够多,足够长的时间,有严重的负面影响。在向交互式终端会话写入时,这可能不是问题,但在对流程输出流进行生产日志记录时,考虑这一点尤为重要。