Преобразование типов данных в JavaScript
Невозможно сложить строку и число. Можно сложить либо два числа, либо две строки между собой. То же самое относится и к другим математическим действиям. Нельзя сравнить между собой логическое значение и число или вычесть из числа строку. Чтобы корректно работать с данными, необходимо привести их к одному типу. В языке JavaScript это можно сделать явным или неявным способом.
Неявное преобразование типов данных
Неявное преобразование типов данных - автоматическое преобразование данных из одного типа в другой. В JavaScript данное преобразование случается, когда необходимо провести операцию над операндами разных типов. Приведём классический пример:
var a, b, c; /*Объявляем переменные a, b, c*/
a=1; /*Задаём значение переменной a*/
b="2"; /*Задаём значение переменной b*/
c=a+b; /*Складываем переменные a и b. Результат этой операции записываем в переменную c*/
alert (c); /*Выводим значение переменной c на экран*/
Посмотрим, что получилось. А получилось 12. Как это так? Переменной a задано числовое значение, переменной b - строковое. Когда над двумя этими операндами производится операция сложения, JavaScript самостоятельно преобразует переменную a к строковому типу, а дальше уже идёт сложение строк, и вместо 3 получается 12. Ниже рассмотрим несколько таблиц, в которых напишем, к какому типу будут преобразованы данные при проведении над ними различных операций.
String (строковое значение) | Number (числовое преобразование) | Boolean (логическое преобразование) | Object (преобразование в объекты) |
"" (пустая строка) | 0 | false | new String("") |
"12" (числовое значение в строке) | 12 | true | new String("12") |
"Привет" (строковое значение, записанное в строку) | NaN | true | new String("Привет") |
Number (числовое значение) | String (строковое преобразование) | Boolean (логическое преобразование) | Object (преобразование в объекты) |
0 | "0" | false | new Number(0) |
-0 | "0" | false | new Number(-0) |
2 | "2" | true | new Number(2) |
NaN | "NaN" | false | new Number(NaN) |
Infinity | "Infinity" | true | new Number(Infinity) |
-Infinity | "-Infinity" | true | new Number(-Infinity) |
Boolean (логическое значение) | String (строковое преобразование) | Number (числовое преобразование) | Object (преобразование в объекты) |
true | "true" | 1 | new Boolean(1) |
false | "false" | 0 | new Boolean(0) |
Специальное значение | Boolean | String | Number | Object |
null | false | "null" | 0 | ошибка TypeError |
undefined | false | "undefined" | NaN | ошибка typeError |
Неявное преобразование JavaScript осуществляет в зависимости от операции, проводимой над данными. Если при сложении строки и числа, число преобразуется в строку автоматически, то при вычитании из числа строки результат получается совсем другой. Смотрим пример:
var a, b, c; /*Объявляем переменные a, b, c*/
a=1; /*Задаём значение переменной a*/
b="2"; /*Задаём значение переменной b*/
c=a-b; /*Вычитаем из переменной a и переменную b. Результат этой операции записываем в переменную c*/
alert (c); /*Выводим значение переменной c на экран*/
Запускаем. На экране число -1. В случае проведения операции вычитания, строка "2" преобразовалась в число. Из числа 1 вычли число 2. Получилось -1.
Явное преобразование типов данных в Javascript
Результат преобразования типов данных неявным способом не всегда будет удовлетворять нашим ожиданиям. Возьмём пример сложения двух переменных и зададим им значения "по умолчанию":
var a, b, c; /*Объявляем переменные a, b, c*/
a=prompt ("Введите переменную a", 10); /*запускаем функцию prompt для ввода данных в переменную a*/
b=prompt ("Введите переменную b", 3); /*запускаем функцию prompt для ввода данных в переменную b*/
c=a+b; /*Складываем переменные a и b. Результат этой операции записываем в переменную c*/
alert (c); /*Выводим значение переменной c на экран*/
В результате, складывали 2 числа, а в получилась конкатенация. В функцию prompt, по умолчанию, можно записать данные только строкового типа, что и было сделано. Чтобы не возникало подобных недоразумений, необходимо использовать явное преобразование типов данных, а именно приводить переменные к одинаковому типу самостоятельно.
Строковое преобразование
Стороковым преобразованием является преобразование любых типов данных в строки. Делается это при помощи метода String(), в скобках указывается переменная (значение), над которой необходимо произвести операцию. Рассмотрим пример:
var a, b, c, d, e; /*Объявляем переменные a, b, c, d, e*/
a=1; /*Задаём числовое значение переменной a*/
b=String(a); /*Приводим переменную a к строковому типу и записываем значение в переменную b*/
c=2; /*Задаём числовое значение переменной c*/
d=(a+c); /*Складываем переменные a и c. Результат записываем в переменную d*/
e=(b+c); /*Складываем переменные b и c. Результат записываем в переменную e*/
alert("число 1 + число 2 = "+d); /*Выводим сообщение число 1+ число 2 = и значение переменной d на экран*/
alert("строка 1 + строка 2 = "+e); /*Выводим сообщение строка 1 + строка 2= и значение переменной e на экран*/
Запускаем. На экране по порядку выскакивают 2 окна, первое: "число 1 + число 2 = 3". В это случае переменным a и b задано числовое значение. В результате сложения двух чисел, получается число. Во втором окне сообщение: "строка 1 + строка 2 = 12". Здесь одну из складываемых переменных мы привели к строковому типу. В результате сложения строки с числом JavaScript неявным способом преобразовал все элементы данный операции в строки.
Числовое преобразование
Числовым преобразованием является преобразование любых типов данных в числа. Делается это при помощи метода Number(), в скобках указывается переменная (значение), над которой необходимо произвести операцию. Происходит преобразование по следующим правилам:
Для строк:
- Строка, в которой содержится только одно число в число и преобразуется. Например: "-1" преобразуется в -1, "1.6" преобразуется в 1.6;
- Пустая строка или строка, содержащая только пробелы преобразуется в 0;
- Если в строке размещается одно число, несколько пробелов, символов переноса строки (\n) и возврата каретки (\r), то пробелы и символы откидываются и остаётся только число;
- Любой вариант, отличный от предыдущих преобразуется в NaN.
Для логических значений:
- Значение true преобразуется в 1;
- Значение false преобразуется в 0.
Для специальных значений:
- Значение null преобразуется в 0;
- Значение undefined преобразуется в NaN.
Аналогом метода Number(), является поставленный перед преобразуемым значением +. Number("5") и +"5" - одно и то же.
Логическое преобразование
Все типы данных преобразуются в логические значения при помощи метода Boolen(), в скобках указывается переменная (значение), подвергаемая преобразованию. Все значения, являющиеся "пустыми" представляются как false их немного:
- Пустая строка;
- 0;
- null;
- undefined;
- NaN;
Всё остальное представляется как true.
Преобразование простых типов в объекты
Простые типы данных преобразуются в объекты при помощи методов String(), Number() и Boolean():
var a, b, c; /*Объявляем переменные a, b, c*/
a=new String("1"); /*Создаём из переменной a объект строкового типа a*/
b=new Number(1); /*Создаём из переменной b числовой объект b*/
c=new Bolean(true); /*Создаём из переменной c объект логического типа с*/
Преобразование объектов в простые типы данных
В простые типы объекты преобразуются при помощи методов toString() и valueOf. При помощи toString() возвращается представление объекта в виде строки "[object Object]":
({x:1}).toString()
Метод valueOf возвращает простое значение объекта, если таковое имеется:
({x:2}).valueOf()
Преобразование объектов тема достаточно большая, чтобы затрагивать её в этой статье. Вернёмся к ней в дальнейшем, когда будем работать непосредственно с объектами.
24.05.2018