Learn JavaScript

Math.sign() - метод для определения знака числа в JavaScript

Math.sign() определяет знак числа.

Проще всего запомнить так: метод не меняет число и не округляет его, а просто показывает, положительное оно, отрицательное или ноль.

Синтаксис

Math.sign(x)

x - число, знак которого нужно определить.

Что делает Math.sign()

Метод возвращает:

  • 1, если число положительное
  • -1, если число отрицательное
  • 0, если передан 0
  • -0, если передан -0
  • NaN, если значение нельзя интерпретировать как число

Примеры:

console.log(Math.sign(10));   // 1
console.log(Math.sign(-10));  // -1
console.log(Math.sign(0));    // 0
console.log(Math.sign(3.14)); // 1
console.log(Math.sign(-3.14)); // -1

Что возвращает Math.sign()

Math.sign() возвращает значение типа number.

const result = Math.sign(-25);

console.log(result);        // -1
console.log(typeof result); // "number"

Важно: метод не возвращает true или false. Он возвращает именно число.

Положительные и отрицательные числа

Это основной сценарий использования Math.sign().

console.log(Math.sign(100));   // 1
console.log(Math.sign(-100));  // -1

Это удобно, когда нужно быстро понять знак числа без длинных условий.

Что происходит с 0

Если передать обычный ноль, результатом будет 0.

console.log(Math.sign(0)); // 0

Это логично: у нуля нет положительного или отрицательного знака в обычном смысле.

Что происходит с -0

Это один из самых важных нюансов у Math.sign().

console.log(Math.sign(-0)); // -0

Метод сохраняет отрицательный ноль и не превращает его в обычный 0.

Это можно проверить точнее так:

console.log(Object.is(Math.sign(-0), -0)); // true
console.log(Object.is(Math.sign(0), -0));  // false

То есть:

  • Math.sign(0) возвращает 0
  • Math.sign(-0) возвращает -0

Дробные числа

Math.sign() работает не только с целыми, но и с дробными значениями.

console.log(Math.sign(0.0001));  // 1
console.log(Math.sign(-0.0001)); // -1

Размер числа не важен. Важен только его знак.

Math.sign() не возвращает само число

Иногда кажется, что метод должен вернуть модифицированное значение, но это не так.

console.log(Math.sign(25));  // 1
console.log(Math.sign(-25)); // -1

Метод не возвращает 25 или -25. Он возвращает только информацию о знаке.

Math.sign() и Math.abs()

Math.sign() и Math.abs() часто используют рядом, но делают они разное.

console.log(Math.sign(-8)); // -1
console.log(Math.abs(-8));  // 8
  • Math.sign() показывает знак числа
  • Math.abs() возвращает модуль числа

Если вам нужно понять направление, подходит Math.sign(). Если нужно получить положительное значение без знака, подходит Math.abs().

Без аргумента

Если вызвать Math.sign() без аргумента, результатом будет NaN.

console.log(Math.sign()); // NaN

Так происходит потому, что метод попытается обработать undefined как число.

Неявное приведение типов

Math.sign() сначала пытается привести аргумент к числу.

console.log(Math.sign("5"));   // 1
console.log(Math.sign("-5"));  // -1
console.log(Math.sign(null));  // 0
console.log(Math.sign(true));  // 1
console.log(Math.sign(false)); // 0

Ещё пример:

console.log(Object.is(Math.sign("-0"), -0)); // true

На практике лучше передавать в метод уже готовое число.

Массивы и странные значения

Из-за приведения типов некоторые значения могут вести себя неочевидно.

console.log(Math.sign([]));    // 0
console.log(Math.sign([5]));   // 1
console.log(Math.sign([1, 2])); // NaN

Это ещё одна причина, почему лучше не полагаться на неявное преобразование.

NaN и Infinity

Для специальных значений метод ведёт себя предсказуемо.

console.log(Math.sign(NaN));       // NaN
console.log(Math.sign(Infinity));  // 1
console.log(Math.sign(-Infinity)); // -1

Это полезно помнить:

  • NaN даёт NaN
  • Infinity даёт 1
  • -Infinity даёт -1

Число не меняется

Math.sign() не изменяет исходное значение. Он только возвращает новый результат.

const value = -42;
const result = Math.sign(value);

console.log(value);  // -42
console.log(result); // -1

Когда это полезно

Math.sign() удобно использовать, когда:

  • нужно быстро определить знак числа
  • вы работаете с направлением движения
  • нужно понять, число положительное или отрицательное
  • хочется заменить несколько условий короткой записью

Пример:

const speed = -12;
const direction = Math.sign(speed);

console.log(direction); // -1

Так можно, например, обозначить движение влево как -1, а вправо как 1.

Частые ошибки

Ожидать boolean вместо числа

console.log(Math.sign(5)); // 1

Метод возвращает не true, а число 1.

Думать, что для нуля всегда будет только 0

console.log(Math.sign(0));  // 0
console.log(Math.sign(-0)); // -0

В JavaScript есть отдельное значение -0, и Math.sign() его сохраняет.

Забывать про NaN

console.log(Math.sign(undefined)); // NaN
console.log(Math.sign([1, 2]));    // NaN

Если значение нельзя корректно привести к числу, результатом будет NaN.

Быстрая памятка

  • Math.sign(x) определяет знак числа
  • метод возвращает number
  • 1 означает положительное число
  • -1 означает отрицательное число
  • Math.sign(0) возвращает 0
  • Math.sign(-0) возвращает -0
  • Math.sign(NaN) возвращает NaN
  • это не boolean, а числовой результат

Коротко

Math.sign() - это стандартный способ быстро определить знак числа в JavaScript. Главное, что стоит запомнить: метод возвращает 1, -1, 0, -0 или NaN и при этом отдельно сохраняет отрицательный ноль.