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

Всё, что пользователь вводит в поле формы, приходит в программу строкой – даже если он набрал цифры. В уроке о строках вы уже видели, что плюс со строкой не складывает, а склеивает: '7' + 1 даст не 8, а строку '71'. Число 7 и строка '7' выглядят одинаково, но это разные типы – и правила у них разные. Поэтому прежде чем считать, данные преобразовывают.

Зачем преобразовывать

Данные приходят строками – считать нужно числами.

convert.jsjs
// из формы всё приходит строкойconst input = '7';// 71 – плюс склеил строку с числомconsole.log(input + 1);// 8 – сначала перевели в числоconsole.log(Number(input) + 1);
Одна и та же семёрка – два разных результата.

Преобразование бывает двух видов. Явное преобразование программист записывает сам: Number(input). Неявное выполняет язык во время операции: в выражении '7' + 1 число автоматически превращается в строку. Это центральная идея урока: одни и те же правила перевода работают и когда вы зовёте их сами, и когда их запускает оператор.

На этом этапе нам понадобятся три основные функции явного преобразования: String(), Number() и Boolean(). Каждая берёт значение любого типа и возвращает его версию в своём типе – по строгим правилам.

translators.jsjs
// '42' – число стало строкойconsole.log(String(42));// 42 – строка стала числомconsole.log(Number('42'));// true – правила Boolean разберём нижеconsole.log(Boolean(42));

Правила Number: таблица без сюрпризов

Number(строка) игнорирует пробелы по краям и пытается прочитать число целиком: ' 12 ' станет 12, а '12щенков'NaN («не число»: специальное значение-заглушка для несостоявшегося результата, подробно о нём – в уроке «Округление и точность чисел»). Хвост из букв не даёт прочитать строку как число.

number-rules.jsjs
console.log(Number('12'));  // 12// 12 – пробелы по краям не мешаютconsole.log(Number('  12  '));// NaN – хвост не дал прочитать целикомconsole.log(Number('12щенков'));

Пустая строка и строка из одних пробелов превращаются в 0 – внутри «ничего числового», и язык считает это нулём.

number-empty.jsjs
// 0 – пустота считается нулёмconsole.log(Number(''));// 0 – одни пробелы: числового внутри ничегоconsole.log(Number('   '));

Отдельно разберём null и undefined. Обе «пустышки», но в число превращаются по-разному: Number(null) – это 0, а Number(undefined)NaN. Так записано в стандарте – но выбор не случайный, и запомнить его помогает смысл самих значений. null кладут руками, когда хотят сказать «здесь ничего нет», а «ничего» в мире чисел – это ноль. undefined означает «значение не задавали», и переводить тут просто нечего: числа из «не задавали» не выходит, поэтому язык отвечает NaN – «не число».

number-nullish.jsjs
// 0 – «здесь ничего нет», а «ничего» в числах – нольconsole.log(Number(null));// NaN – из «не задавали» число не выходитconsole.log(Number(undefined));

Дальше понадобятся два термина. Оператор – сам знак действия: +, *, %. Значения, к которым он применяется, называют . Оператор с двумя операндами называется бинарным (5 * 2), с одним – унарным. С унарным оператором мы сейчас и познакомимся.

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

У знака + есть вторая работа – унарная, с одним значением. Поставленный перед одиночным значением, он приводит это значение к числу: +'42' даёт число 42, +''0, +'abc'NaN. Правила – ровно те, что в таблице выше: по сути унарный плюс – короткая запись Number(). С числами он ничего не делает: +7 так и останется 7.

Пригодится там, где данные приходят текстом – например, из поля ввода. Написать +age быстрее, чем Number(age), и опытный читатель кода поймёт вас без слов.

unary-plus.jsjs
// 42 – число из строкиconsole.log(+'42');console.log(+'3.5');  // 3.5// 0 – пустая строка по таблице Numberconsole.log(+'');// NaN – числом не сталоconsole.log(+'abc');// 7 – с числами ничего не делаетconsole.log(+7);const a = '5';const b = '3';// '53' – плюс двух строк склеиваетconsole.log(a + b);// 8 – сначала оба стали числамиconsole.log(+a + +b);
Не пугайтесь количества плюсов в последней строке: с точки зрения JavaScript тут всё законно – два унарных и одно сложение.

Правила Boolean: короткий список лжи

С Boolean() язык поступил элегантно: вместо длинных правил – короткий список значений, дающих ложь: число 0, пустая строка '', null, undefined, NaN и сам false. Их называют falsy – «ложноподобными». Всё остальное даёт true, без исключений.

Отсюда вырастают привычные ловушки: строка '0' истинна – она не пустая, в ней есть символ; строка 'false' тоже истинна – это пять символов текста, а не булево значение. Проверяя значение на истинность, язык не вникает в смысл написанного, а только смотрит, есть ли оно в списке шести.

truthy-traps.jsjs
// true – строка не пустая: в ней есть символconsole.log(Boolean('0'));// true – пять символов текста, а не булево значениеconsole.log(Boolean('false'));// true – любое ненулевое числоconsole.log(Boolean(42));// false – пустая строка есть в списке шестиconsole.log(Boolean(''));// false – и число нольconsole.log(Boolean(0));// false – намеренная пустотаconsole.log(Boolean(null));

// теперь вы знаете

  1. Явное преобразование пишет программист (Number(input)), неявное запускает оператор ('7' + 1)
  2. Number('') – 0, Number('abc') – NaN: строка превращается в число целиком
  3. Унарный плюс приводит значение к числу: +'42' – короткий Number()
  4. Ложные значения: 0, '', null, undefined, NaN и false – остальное истинно
  5. Оператор + со строкой склеивает, остальная арифметика тянет к числам

Проверьте себя

Что выведет console.log(+'3' + +'4')?

Что выведет console.log('7' + 1)?

Что вернёт Number(' ') (строка из одних пробелов)?

Какая пара верна?

переключают уроки · не работают при фокусе в полях ввода