1. Основы синтаксиса, переменные и типы данных в современном JavaScript
Основы синтаксиса, переменные и типы данных в современном JavaScript
В 1995 году Брендан Эйк создал первую версию JavaScript всего за десять дней. Тогда никто не предполагал, что этот «игрушечный» язык для создания анимаций со снегом на веб-страницах станет фундаментом для сложнейших интерфейсов Facebook, Google Maps и Netflix. Сегодня JavaScript — это не просто скрипты, а мощная экосистема. Однако даже самый опытный разработчик на React может столкнуться с трудноуловимым багом, если он не до конца понимает, как язык обрабатывает типы данных или почему переменная внезапно «всплывает» в коде. Начнем погружение с того, как компьютер интерпретирует наши команды.
Анатомия синтаксиса и культура написания кода
JavaScript — это язык с «си-подобным» синтаксисом. Если вы когда-либо видели код на C++, Java или C#, многие конструкции покажутся вам знакомыми. Но у JS есть свои капризы. Основной единицей выполнения является инструкция (statement). Каждая инструкция — это законченная команда для интерпретатора.
Исторически сложилось, что инструкции разделяются точкой с запятой ;. В современном стандарте ECMAScript (стандарт, по которому живет JS) существует механизм Automatic Semicolon Insertion (ASI). Он позволяет опускать точку с запятой в большинстве случаев, так как среда выполнения расставит их сама. Однако это «магическое» поведение иногда приводит к ошибкам. Например, если вы решите перенести возвращаемое значение функции на новую строку после ключевого слова return, интерпретатор может вставить ; сразу после return, и ваша функция вернет undefined вместо ожидаемых данных. Поэтому в профессиональном сообществе принято либо всегда ставить точки с запятой, либо использовать инструменты автоматического форматирования (например, Prettier), которые делают код единообразным.
Важную роль играют комментарии. В JS они бывают двух видов:
// текст комментария./ текст комментария /.Хорошим тоном считается писать код так, чтобы он был самодокументированным. Вместо того чтобы писать комментарий «здесь мы вычисляем налог», лучше назвать переменную taxAmount.
Эволюция переменных: от var к let и const
Переменная — это именованное хранилище для данных. В JavaScript способ объявления переменных радикально изменился с выходом стандарта ES6 в 2015 году. До этого существовало только ключевое слово var.
Основная проблема var заключается в отсутствии блочной области видимости. Если вы объявите переменную через var внутри цикла или условия if, она будет доступна и за их пределами. Это часто приводило к конфликтам имен и непредсказуемому поведению программы. Кроме того, var подвержен эффекту «всплытия» (hoisting): вы можете обратиться к переменной до того, как она объявлена в коде, и не получите ошибку (она просто будет содержать undefined).
Современный стандарт ввел let и const, которые работают иначе:
* Область видимости: Они ограничены блоком {...}. Если переменная создана внутри if, она «умрет» вместе с окончанием этого блока.
* Временная мертвая зона: Вы не можете обратиться к let или const до их объявления. Попытка сделать это вызовет ReferenceError.
Различие между let и const фундаментально для чистоты кода.
* let используется, когда значение переменной будет меняться в процессе работы программы (например, счетчик в цикле).
* const (константа) используется для значений, которые не должны переназначаться.
> Важный нюанс: const запрещает только переприсваивание самой переменной. Если в константе хранится объект или массив, вы все еще можете изменять их внутреннее содержимое (добавлять свойства или элементы). Это часто путает новичков, ожидающих полной неизменяемости.
При выборе между ними всегда следуйте правилу «минимальных привилегий»: используйте const по умолчанию, и только если вы уверены, что значение должно измениться, меняйте его на let. Это защищает ваш код от случайных мутаций.
Динамическая типизация и примитивы
JavaScript — это язык с динамической типизацией. Это значит, что переменная не привязана к конкретному типу данных навсегда. В одну и ту же переменную вы можете сначала записать число, а затем строку.
Типы данных в JS делятся на две большие группы: примитивы и объекты. Примитивы передаются по значению и являются неизменяемыми (immutable). Если вы меняете строку, JS на самом деле создает новую строку в памяти.
Числа (Number и BigInt)
ТипNumber представляет собой 64-битное число с плавающей точкой в формате IEEE 754. В JS нет разделения на целые числа и числа с запятой (как int и float в других языках).
Существуют специальные числовые значения:
* Infinity и -Infinity: результат деления на ноль.
* NaN (Not a Number): результат ошибочной математической операции (например, деления строки на число).> Особенность NaN в том, что он не равен самому себе. Проверка ` вернет false. Для проверки используется функция Number.isNaN().
Для работы с очень большими целыми числами, которые выходят за пределы безопасного диапазона Number (), используется тип BigInt. Он создается путем добавления буквы n в конце числа: 100n.
Строки (String)
Строки в JS можно оборачивать в три вида кавычек: и двойные "..." идентичны. ... позволяют использовать шаблонные строки. В них можно вставлять выражения с помощью конструкции {user}!); // ИнтерполяцияЧтобы код был предсказуемым, лучше использовать явное преобразование:
*
Number(value) — к числу.
* String(value) — к строке.
* Boolean(value) — к логическому типу.Особое внимание стоит уделить преобразованию в число. Если строка содержит не только цифры, результатом будет
NaN. Исключением является функция parseInt(), которая пытается «вытащить» число из начала строки, пока не встретит посторонний символ.Практика именования и чистота кода
В JavaScript принят стиль camelCase для переменных и функций (например,
calculateTotalPrice). Имена классов обычно пишутся в PascalCase (UserAccount). Константы, значения которых известны до начала выполнения программы и не меняются (так называемые «жесткие константы»), пишутся в UPPER_SNAKE_CASE (API_KEY).Имя переменной должно отвечать на вопрос «что это?», а не «какого это типа?». Плохо:
userArray. Хорошо: users. Избегайте сокращений вроде data, item, val`, если из контекста не очевидно, что именно там хранится.Понимание этих базовых кирпичиков — синтаксиса, переменных и типов — позволяет не просто писать код, который работает, а понимать, почему он работает именно так. В следующих главах мы увидим, как эти данные оживают внутри функций и организуются в сложные структуры массивов и объектов, что в конечном итоге позволит нам строить динамические интерфейсы.