Что такое LIFO и FIFO
Что проверяют
Базовое понимание структур данных, но во фронтенде вопрос почти всегда ведёт дальше: к стеку вызовов и очередям цикла событий. Ответ по учебнику вызовет следующий вопрос про порядок выполнения, и лучше зайти туда самому.
Как отвечать
LIFO означает «последним пришёл, первым вышел»: это стек, доступ есть только к верхушке, операции добавления и снятия. FIFO означает «первым пришёл, первым вышел»: это очередь, кладут в хвост, берут из головы. В нормальной реализации обе операции выполняются за постоянное время.
Где это встречается в браузере:
- стек вызовов работает по LIFO, отсюда и переполнение при бесконечной рекурсии, и порядок кадров в трассировке ошибки;
- очередь задач и очередь микрозадач работают по FIFO, а промисы попадают именно в очередь микрозадач;
- история навигации и отмена действий ведут себя как стек;
- буферы, очереди запросов и анимационные очереди это FIFO.
Про реализацию полезно добавить, что массив хорош как стек, а как очередь плох: снятие с головы сдвигает все элементы и стоит линейного времени, поэтому на больших объёмах берут кольцевой буфер или указатель на голову.
const queue = [];
let head = 0;
queue.push(task);
const next = head < queue.length ? queue[head++] : undefined;Где спотыкаются
Отвечают только про учебные стек и очередь и не связывают их со средой, в которой работают. На фронтенде оба понятия объясняют реальное поведение движка, и примеры лучше брать оттуда.
Строят очередь на массиве со снятием с головы в горячем цикле и получают квадратичное поведение при росте данных, хотя добавление и снятие с конца стоят дёшево.
Путают очереди при разборе порядка выполнения: считают, что таймер с нулевой задержкой сработает раньше уже разрешённого промиса. Микрозадачи опустошаются полностью до перехода к следующей макрозадаче, и порядок окажется обратным ожидаемому.