Змест паведамлення
Что вообще происходит в этом вашем JavaScript — языке, где null == undefined возвращает true, а NaN === NaN — false. Если вы чувствуете, что мир рушится — спокойно, так и должно быть. Вот подборка понятий, которые одновременно пугают, интригуют и заставляют гуглить "js how to not cry every day": 1. Hoisting JavaScript сначала поднимает объявления переменных и функций вверх, как флаг на линейке. Только вот значения не поднимает. Поэтому console.log(a) до var a = 5; — undefined, но не ошибка. А потом вы узнаёте про let и const и понимаете, что всё было не так просто. 2. Callback Hell Когда у тебя функция внутри функции, которая вызывает другую функцию внутри другой функции — и ты в аду. Добро пожаловать! Обещают, что с async/await станет легче. Иногда это правда. 3. Типизация на доверии "5" + 1 — это "51", а "5" - 1 — это 4. Типы данных в JavaScript — как кошки: делают, что хотят. Изучать приведение типов — как наблюдать за хищником в дикой природе. Интересно, но стрёмно. 4. Event Loop Тот самый круговорот тасок, микротасок и коллбеков. Простой вопрос: setTimeout(fn, 0) — когда выполнится? Ответ: не сразу. Почему? Потому что Event Loop™️. Сиди, учи, страдай, гордись. 5. Замыкания (Closures) Это когда функция помнит, в каком окружении она была создана, даже если всё остальное уже давно умерло. По сути — функция-некромант. Очень удобно, если не боишься тёмной магии. 6. this Что такое this? Зависит от контекста. В одном случае — объект, в другом — undefined, в третьем — кто-то вызовет .bind() и всё сломает. this — это как бывший: иногда возвращается и ты не понимаешь, зачем. 7. == vs === Двойное равно — это «я тебя понимаю, но по-своему». Тройное — «я тебя понял буквально». Поэтому лучше сразу использовать ===, если не хотите сюрпризов вроде [] == ![] // true.