Преобразование типов данных

Что будет, если к числу прибавить строку?

let str = '5', x = 3;
let var1 = x + str;       // Переменная содержит строку '35'
console.log(var1);        // 35
console.log(typeof var1); // string
let var2 = str + x;       // Переменная содержит строку '53'
console.log(var2);        // 53
console.log(typeof var2); // string

В этом случае интерпретатор столкнется с несовместимостью типов данных и попытается преобразовать переменные к одному типу данных, а затем выполнить операцию. В нашем случае переменная x, имеющая тип number (число), будет преобразована к типу string (строка), а затем будет произведена операция конкатенации строк.

А что будет, если из числа вычесть строку, число умножить на строку или число разделить на строку?

let str = '5', x = 15;
let var1 = x - str;       // Переменная содержит число 10
console.log(var1);        // 10
console.log(typeof var1); // number
let var2 = x * str;       // Переменная содержит число 75
console.log(var2);        // 75
console.log(typeof var2); // number
let var3 = x / str;       // Переменная содержит число 3
console.log(var3);        // 3
console.log(typeof var3); // number

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

let var4 = str * x;       // Переменная содержит число 75
console.log(var4);        // 75
console.log(typeof var4); // number

Но что будет, если в строке будут одни буквы?

let str = 'Строка', x = 15;
let var1 = x - str;       // Переменная содержит значение NaN
console.log(var1);        // NaN
console.log(typeof var1); // number

В этом случае интерпретатор не сможет преобразовать строку в число и присвоит переменной значение NaN (Not a Number, не число).

С одной стороны, хорошо, что интерпретатор делает преобразование типов данных за нас. Но с другой стороны, можно получить результат, который вовсе не планировался. По этой причине лучше оперировать переменными одного типа, а если необходимо делать преобразования типов, то делать это самим.

Для преобразования типов данных можно использовать следующие встроенные функции JavaScript:

  • parseInt(<Строка>[, <Основание>]) — преобразует строку в целое число. Строка считается заданной в системе счисления, указанной вторым необязательным параметром. Если основание не указано, то система счисления выбирается автоматически и зависит от префиксов в строке, например, если строка начинается с 0x, то будет использоваться основание 16. Если строка не может быть преобразована в число, возвращается значение NaN:
console.log( parseInt('10') );         // 10
console.log( parseInt('0xFF') );       // 255
console.log( parseInt('0xFF', 16) );   // 255
console.log( parseInt('0167', 8) );    // 119
console.log( parseInt('1110111', 2) ); // 119
console.log( parseInt('строка', 2) );  // NaN
  • parseFloat(<Строка>) — преобразует строку в число с плавающей точкой:
console.log( parseFloat('5.2') );      // 5.2
console.log( parseFloat('5e-2') );     // 0.05
console.log( parseFloat('строка') );   // NaN

Для преобразования числа в строку используется метод toString([<Основание>]):

let x = 10, y = 5.2;
console.log( x.toString() );     // 10
console.log( x.toString(8) );    // 12
console.log( y.toString() );     // 5.2

Рассмотрим пример использования преобразования типов данных. Просуммируем два числа, переданных пользователем в командной строке (листинг 3.1).

Листинг 3.1. Вычисление суммы двух чисел

const process = require('process');

// Проверяем передачу чисел в командной строке
if (process.argv.length == 4) {
   let x, y, sum1, sum2, msg;
   // Получаем значения из командной строки
   x = process.argv[2];
   y = process.argv[3];
   // Вычисляем сумму чисел
   sum1 = x + y;
   msg = 'До преобразования типов:\n';
   msg += 'Значение суммы чисел ';
   msg += x + ' и ' + y + ' равно ';
   msg += sum1 + '\n\n';
   sum2 = parseInt(x, 10) + parseInt(y, 10);
   msg += 'После преобразования типов:\n';
   msg += 'Значение суммы чисел ' + x + ' и ';
   msg += y + ' равно ' + sum2;
   console.log(msg);
}
else {
   // Если числа не переданы
   console.log('Передайте 2 числа в конце команды');
}

Если мы не укажем числа после команды, то получим сообщение из блока else:

C:\book\p1>node index.js
Передайте 2 числа в конце команды

Если указать два числа 5, то в окне консоли отобразится следующий текст:

C:\book\p1>node index.js 5 5
До преобразования типов:
Значение суммы чисел 5 и 5 равно 55

После преобразования типов:
Значение суммы чисел 5 и 5 равно 10

Итак, данные, передаваемые в командной строке или получаемые из диалоговых окон в Web-браузере, имеют тип данных string (строка). Чтобы получить сумму двух чисел, нужно обязательно выполнить преобразование типов, иначе мы получим еще одну строку, а не сумму.

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов