¿Qué hace setTimeout cuando se establece en 0 milisegundos?

En JavaScriptsetTimeout(callback, delay) significa "llamarcallback despuésdelay milisegundos ". Pero ¿y sidelay es0? Debería llamarcallback ¿inmediatamente?

Estoy confundido por lo que veo cuando ejecuto el siguiente código:

setTimeout(function() { 
    console.log('AAA');
}, 0); // Call this in 0 milliseconds 

for (i = 0; i < 1000; i++) {
    console.log('BBB'); 
}
for (i = 0; i < 1000; i++) {
    console.log('CCC'); 
}
for (i = 0; i < 1000; i++) {
    console.log('DDD'); 
}
for (i = 0; i < 1000; i++) {
    console.log('EEE'); 
}

Esto registra lo siguiente en la consola:

Esperaba verAAA registrado mucho antes que eso. Hubo tiempo para ejecutar otras 4000 llamadas aconsole.log antes de una función que debería haberse llamado de inmediato.

¿Alguien puede explicar quésetTimeout Qué está haciendo cuando el retraso se establece en 0 milisegundos?

Respuestas a la pregunta(1)

Su respuesta a la pregunta