← Назад к вопросам

Какой вид преобразования типов у функции Number?

1.8 Middle🔥 141 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Тип преобразования, выполняемый функцией Number

Функция Number() в JavaScript является функцией явного преобразования типов, предназначенной для преобразования различных значений к числовому типу (number). Это один из основных способов явного (explicit) преобразования или приведения типов (type coercion), когда разработчик сознательно и напрямую указывает, что необходимо получить числовой результат.

Механизм работы и правила преобразования

Number() действует как функция-конструктор (при использовании с new) или как функция преобразования (при прямом вызове). В контексте преобразования типов мы рассматриваем её вызов в виде Number(value). Алгоритм её работы соответствует стандарту ECMAScript и включает следующие ключевые правила:

1. Преобразование примитивных типов:

  • Числа (number): Возвращается само число без изменений.
    Number(42); // 42
    Number(3.14); // 3.14
    
  • Строки (string): Строка интерпретируется как числовой литерал. Если строка полностью представляет допустимое число (включая десятичные, шестнадцатеричные, экспоненциальные форматы), возвращается соответствующее число. Пустая строка или строка только из пробелов преобразуется в 0. Если строка не может быть распознана как число, возвращается NaN.
    Number("123"); // 123
    Number("12.5"); // 12.5
    Number(""); // 0
    Number("   "); // 0
    Number("abc"); // NaN
    Number("123abc"); // NaN
    
  • Булевы значения (boolean): true преобразуется в 1, false в 0.
    Number(true); // 1
    Number(false); // 0
    
  • null: Преобразуется в 0.
    Number(null); // 0
    
  • undefined: Преобразуется в специальное значение NaN (Not-a-Number).
    Number(undefined); // NaN
    
  • Symbol: Попытка преобразования символа к числу вызывает TypeError.

2. Преобразование объектов (object): Для объектов Number() использует более сложный алгоритм:

  1. Сначала проверяется наличие метода valueOf(). Если он существует и возвращает примитивное значение (не объект), это значение используется для дальнейшего преобразования.
  2. Если valueOf() не возвращает примитив или не удовлетворяет, то проверяется метод toString(). Если он возвращает примитивную строку, эта строка затем преобразуется по правилам для строк.
  3. Если ни один из методов не возвращает примитив, выбрасывается TypeError (в современном JavaScript, но исторически могло приводить к NaN).
// Объект с valueOf
let obj1 = { valueOf: () => 42 };
Number(obj1); // 42

// Объект с toString
let obj2 = { toString: () => "100" };
Number(obj2); // 100

// Массив: toString возвращает строку элементов, разделённых запятыми
Number([123]); // 123 (toString -> "123")
Number([1, 2]); // NaN (toString -> "1,2", что не число)

// Дата: valueOf возвращает timestamp в миллисекундах
Number(new Date()); // Число типа 1712845674321

Сравнение с другими формами преобразования к числу

  • Явное преобразование (Number()): Чёткий и контролируемый способ.
  • Неявное преобразование (implicit coercion): Автоматическое преобразование в числовых контекстах (операторы -, *, /, сравнения >, <). Например, "5" - 2 даст 3.
  • Оператор + перед значением (+value): Краткая форма явного преобразования, идентичная Number(value).
    +"123"; // 123
    +true; // 1
    
  • Функция parseInt() и parseFloat(): Специализированные функции для преобразования строк к целым и дробным числам. Они менее строги — parseInt("123px") вернет 123, тогда как Number("123px") вернет NaN.

Ключевые особенности и важные замечания

  • NaN как результат: Number() может вернуть NaN для непредставимых в числе значений (undefined, некорректные строки). NaN — это специальное числовое значение, обозначающее ошибку вычисления.
  • Целостность процесса: Процесс строго определён стандартом, что делает поведение предсказуемым.
  • Отличие от new Number(): Вызов Number(value) возвращает примитив (number), а new Number(value) создаёт объект Number, что почти никогда не требуется в практике и считается антипаттерном.

Таким образом, функция Number() выполняет явное преобразование к числовому типу с использованием стандартизированного алгоритма, охватывающего все типы данных JavaScript. Это мощный и часто используемый инструмент для безопасного и понятного получения числовых значений из разнородных входных данных.