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

В чём разница между приведением типов к числу через number и через унарный плюс?

2.0 Middle🔥 131 комментариев
#JavaScript Core

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

Разница между Number() и унарным плюсом при приведении типов

Краткий ответ

Number() и унарный плюс (+) имеют одинаковые правила преобразования типов, но отличаются в производительности и читаемости:

  • Number() - явное преобразование, явный вызов функции
  • Унарный плюс - неявное преобразование, более компактный синтаксис

Правила преобразования

Оба способа используют одни и те же правила приведения типов:

// Строки в числа
Number("42") === +"42" // true, обе дают 42
Number("") === +"" // true, обе дают 0
Number("  123  ") === +"  123  " // true, обе дают 123
Number(" 3.14") === +" 3.14" // true, обе дают 3.14

// Булевы значения
Number(true) === +true // true, обе дают 1
Number(false) === +false // true, обе дают 0

// null и undefined
Number(null) === +null // true, обе дают 0
Number(undefined) === +undefined // true, обе дают NaN

// Пустые строки
Number("") // 0
+"" // 0

// Строки с пробелами
Number("   ") // 0
+"   " // 0

// Невалидные строки
Number("abc") // NaN
+"abc" // NaN

// Массивы
Number([5]) // 5
+[5] // 5
Number([1, 2]) // NaN (не однозначное значение)
+[1, 2] // NaN

// Объекты
Number({}) // NaN
+{} // NaN

Различия в производительности

Унарный плюс немного быстрее, так как это встроенный оператор, который не требует поиска функции:

// Производительность унарного плюса выше
const value = +str; // Прямое преобразование
const value = Number(str); // Вызов функции с поиском

Однако в современных JavaScript движках (V8, SpiderMonkey) разница минимальна и может игнорироваться для читаемости.

Отличия в читаемости и контексте

Number() более явный и понятный:

// Явный вызов функции - ясно, что происходит преобразование
const age = Number(input);
const price = Number(formValue);

// Может быть непонятно новичку
const age = +input;
const price = +formValue;

Унарный плюс часто используется как трюк:

// Идиоматичный JavaScript
const parsed = +"123"; // Опытные разработчики сразу поймут
const count = +event.target.value; // Компактно в обработчиках

// Но может быть запутанным
const result = ++counter; // А это инкремент или плюс?
const doubled = + + value; // Двойной плюс

Практические примеры

// Приведение значения из input
const userInput = document.querySelector(input).value;
const number1 = Number(userInput); // Явно
const number2 = +userInput; // Компактно

// В функциях
function processValue(val) {
  const num = +val; // Принято в коде с множеством преобразований
}

// При валидации
if (+input === parseInt(input)) {
  // Значение - целое число
}

// Трансформация массива
const nums = ["1", "2", "3"].map(Number); // Явно с функцией
const nums = ["1", "2", "3"].map(x => +x); // С унарным плюсом

// Но проще просто:
const nums = ["1", "2", "3"].map(Number); // Читаемо

Граничные случаи

// Строки с научной нотацией
Number("1e3") === +"1e3" // true, обе дают 1000

// Шестнадцатеричные числа
Number("0xFF") // 255
+"0xFF" // NaN - унарный плюс НЕ поддерживает hex!

// Это главное отличие!

Это самое значительное отличие! Number() поддерживает шестнадцатеричную нотацию, унарный плюс - нет.

Рекомендации

  • Используй Number() для явности и совместимости с шестнадцатеричными числами
  • Используй унарный плюс в компактном коде, где контекст ясен (функции обратного вызова, вычисления)
  • Избегай унарного плюса если есть риск путаницы с инкрементом ++

Заключение

Оба способа функционально эквивалентны в большинстве случаев, но Number() более универсален (поддерживает hex) и явен. Выбирайте в зависимости от читаемости и контекста вашего кода.