Сколько потоков в JS?
Основы языка
В JavaScript один основной поток выполнения. Весь пользовательский код работает в одном потоке, а асинхронность обеспечивается Event Loop и Web API окружения.
Однопоточность
В каждый момент выполняется только одна операция (один call stack). Два куска JS не выполняются параллельно в основном потоке.
console.log('1');
setTimeout(() => console.log('2'), 0); // браузер держит таймер вне потока
console.log('3');
// 1, 3, 2Как достигается асинхронность
Долгие операции (таймеры, сеть, I/O) выполняет окружение (браузер/Node) вне JS-потока, а их коллбэки Event Loop ставит в очередь и выполняет, когда стек свободен.
Дополнительные потоки
Хотя основной поток один, параллелизм возможен:
- Web Workers — отдельные потоки для тяжёлых вычислений (без доступа к DOM, обмен сообщениями).
- Браузер сам использует потоки для сети, рендеринга, но код в них не пишут напрямую.
- В Node.js — Worker Threads, а часть I/O выполняет пул потоков libuv.
Почему однопоточность
Упрощает работу с DOM (нет гонок и блокировок). Плата — тяжёлый синхронный код блокирует UI.
Коротко для собеседования
У JS один основной поток выполнения; асинхронность даёт не многопоточность, а Event Loop + Web API. Для реального параллелизма есть Web Workers (браузер) и Worker Threads (Node), но без доступа к DOM и с обменом сообщениями.