Объект Math в JavaScript — это незаметный пояс с инструментами языка. Его никогда не нужно инициализировать. Его никогда не нужно импортировать. Он просто существует в каждой среде выполнения, готовый выполнить любую задачу: от округления значения пикселя до генерации случайного броска кубика. Поскольку Math является статическим объектом, каждый метод и свойство привязаны непосредственно к пространству имен. Вы пишете Math.PI, а не new Math().PI. Такое проектное решение упрощает работу, но также означает, что у объекта есть несколько «острых углов», которые стоит изучить, прежде чем полагаться на него в рабочей логике.
Статический объект без конструктора
Большинство встроенных объектов JavaScript требуют создания экземпляра. Вы вызываете new Date() или new Array(). Math отказывается. Он спроектирован как пространство имен связанных функций и констант, работающих с примитивным типом Number. Вызовите Math.sqrt(16), и вы получите 4. Попробуйте использовать ключевое слово new, и движок выдаст TypeError. Такой паттерн позволяет экономить память и сигнализирует о том, что Math является чисто функциональным. Он принимает входные данные, возвращает результаты и ничего не изменяет.
Есть одно строгое ограничение, о котором стоит помнить: Math работает со стандартными числами IEEE 754. Он не работает с BigInt. Передайте BigInt в Math.round() или Math.abs(), и вы получите TypeError. Если ваше приложение работает с 64-битными целыми числами или больше, вам нужно либо привести их к обычному типу, либо использовать нативные операторы BigInt для арифметических операций.
Константы, которые вы действительно используете
Объект Math предоставляет несколько числовых констант, которые избавляют вас от необходимости прописывать «магические числа» вручную.
Math.PI— знакомое 3.14159..., необходимо для всего, что связано с кругами, тригонометрией или преобразованием градусов в радианы.Math.E— число Эйлера, примерно 2.718. Оно встречается в кривых экспоненциального роста, расчетах сложных процентов и логарифмических шкалах.Math.SQRT2— квадратный корень из двух, примерно 1.414. Он удобен, когда вам нужно найти диагональ квадрата или нормализовать векторы в простой геометрии.Math.LN2— натуральный логарифм 2, примерно 0.693. Вы встретите его в алгоритмах, работающих с бинарными деревьями, энтропией информации или анализом временной сложности с использованием логарифмов по основанию 2.
Эти значения являются числами с плавающей запятой двойной точности. Поскольку это свойства, а не методы, вы обращаетесь к ним без скобок.
Округление, знаки и абсолютные значения
Самые распространенные задачи с Math связаны с «очисткой» чисел. JavaScript предоставляет четыре метода округления, и они ведут себя по-разному, особенно когда вы выходите за пределы положительных чисел.
Math.abs(x) возвращает модуль числа. Передайте ему -42, и вы получите 42. Это полезно, когда вам важна дистанция, а не направление. Например, при сравнении временных меток, расчете дельты перетаскивания в интерфейсе или проверке, попадает ли значение в диапазон погрешности.
Math.round(x) — это школьный метод округления. Он округляет до ближайшего целого, при этом дробная часть 0.5 округляется вверх к следующему положительному целому. Таким образом, 4.4 превращается в 4, а 4.5 — в 5.
Math.ceil(x) всегда округляет вверх до ближайшего целого. 4.1 превращается в 5, а -4.9 — в -4. Последний случай часто удивляет людей. Поскольку на числовой прямой -4 больше, чем -4.9, ceil для отрицательных чисел движется в сторону нуля.
Math.floor(x) — это противоположность. Он всегда округляет вниз. 4.9 превращается в 4, а -4.1 — в -5. Если вы реализуете пагинацию результатов поиска или выделяете блоки памяти фиксированного размера, floor — это обычно то, что вам нужно.
Math.trunc(x) полностью отсекает дробную часть, оставляя только целую. По сути, он движется в сторону нуля независимо от знака. 4.9 превращается в 4, а -4.9 — в -4. Если вы переносите логику из языков, где числа с плавающей запятой приводятся к целым путем отсечения дробной части, этот метод станет вашим лучшим другом.
Наконец, Math.sign(x) сообщает, с какой стороны от нуля находится значение. Он возвращает 1 для положительных чисел, -1 для отрицательных, 0 для положительного нуля, -0 для отрицательного нуля и NaN для всего остального. Это лаконичный способ разветвления логики в зависимости от направления без написания цепочки if-else.
Генерация случайных чисел
Math.random() генерирует псевдослучайное число с плавающей запятой в диапазоне от 0 (включительно) до 1 (исключительно). Оно не является криптографически безопасным, поэтому не используйте его для генерации паролей, создания токенов или любых задач, связанных с реальными деньгами.
