Cenário: prever a ordem de saída com setTimeout e Promise
Pergunta
No trecho: `console.log(1); setTimeout(() => console.log(2), 0); Promise.resolve().then(() => console.log(3)); console.log(4);` — qual a ordem de saída e por quê?
Resposta esperada
Saída: 1, 4, 3, 2. Explicação: `console.log(1)` e `console.log(4)` são síncronos e rodam primeiro, na ordem. O `.then` da Promise agenda uma microtask; o `setTimeout` agenda uma macrotask (task). Ao terminar o script síncrono, o event loop esvazia TODA a fila de microtasks antes de pegar a próxima macrotask — então `3` (microtask) sai antes de `2` (macrotask do timer), mesmo o timer sendo `0ms`. A regra a verbalizar: microtasks (Promises, queueMicrotask) têm prioridade sobre tasks (timers, I/O, eventos) e a fila de microtasks é drenada por completo entre cada task.
Por que perguntam isso
Cenário sênior de JS. O erro comum é responder 1,4,2,3 por achar que `setTimeout(...,0)` roda 'imediatamente'. Quem acerta sabe distinguir microtask de macrotask e a regra de drenagem.