从实际运行结果来说是的,但是并非没有逻辑。
官方有文档专门说明这个事情:
然后node.js阶段划分如下:
setTimout均在timers phase阶段执行,setImmediate均在check阶段执行。也就是说,在事件循环里setTimeout比setImmediate有更高的优先级(很多人一直误解setImmediate执行优先级比setTimeout高或者优先级相同),但是如果存在poll phase阶段,则此阶段后先进入check phase把setImmediate执行完,造成某些情况下setImmediate总比setTimeout先执行的现象。
setTimeout(fn, 0)和setImmediate的执行顺序如文档所说——取决于机器的性能。首先,setTimeout的threshold有限制范围,传0会被强行转换为最小值1ms,所以如果你的计算机性能很好能在1ms内执行到timers phase的话,setTimeout由于时间延迟不满足则不会触发,如果性能很差劲事件循环执行到timers phase已经超过1ms了那么setTimeout就会被先执行。