JavaScript является синхронным или асинхронным

Ответ

JavaScript — однопоточный и синхронный язык, но с возможностью асинхронного выполнения кода через механизмы Event Loop, Web APIs (в браузере) и Callback Queue.

Пример синхронного кода:

console.log('1');
console.log('2'); // Выполняется строго после '1'

Пример асинхронного кода:

console.log('1');
setTimeout(() => console.log('2'), 0); // Попадает в очередь и выполнится после синхронного кода
console.log('3');
// Результат: 1, 3, 2

Асинхронность достигается через колбэки, промисы и async/await, но сам движок JS обрабатывает код синхронно.

Ответ 18+ 🔞

А, ну это же классика, блядь! Сидишь такой, думаешь: "Ну, JavaScript, что ты за зверь такой?" А он, сука, оказывается, однопоточный ублюдок, но с прикрученной асинхронностью, как ёбаный велосипед с реактивным двигателем!

Представь себе, чувак: движок — это один мудак-грузчик на складе (поток один, блядь). Работает он синхронно, то есть таскает коробки строго по очереди. Вот тебе синхронный код, пиздец как просто:

console.log('1');
console.log('2'); // Выполняется строго после '1'

Сказал "раз" — выебал первую коробку. Сказал "два" — пошёл за второй. Всё предсказуемо, как день зарплаты и последующее похмелье.

А теперь смотри сюда, волшебство начинается! Этот же самый грузчик — хитрая жопа! Видит задачу setTimeout, и такой: "О, ёпта, это же надо подождать, даже если ноль миллисекунд!". И он не ждёт, сука! Он выкидывает эту задачку в какую-то ёбаную параллельную вселенную (Web APIs), а сам бежит дальше по складу!

console.log('1');
setTimeout(() => console.log('2'), 0); // Попадает в очередь и выполнится после синхронного кода
console.log('3');
// Результат: 1, 3, 2

Смотри что выходит: он крикнул "1", потом отшвырнул колбэк в эту самую очередь (Callback Queue), как говно в вентилятор, потом сразу же орет "3". А колбэк этот, бедолага, будет сидеть и ждать, пока весь синхронный код не кончится, и только потом Event Loop его подцепит и запустит. Поэтому "2" вылезает в самом конце, хоть и с нулевой задержкой! Удивление пиздец, да?

Вот так и живём: колбэки, промисы, async/await — всё это просто красивые обёртки над одной и той же пиздопроебибной системой. Движок-то внутри всё равно жуёт код синхронно, кусок за куском. А вся эта асинхронная магия — это просто ловкость рук и ебаный Event Loop, который подкидывает задачи обратно в стек, когда тот пустой. Во все дыры давалка, короче.