Преобразование типов данных Javascript
Значения в Javascript могут быть свободно конвертированы из одного типа в другой. К примеру, если какой-то оператор ожидает получения значения определенного типа, а ему передается значение другого, то интерпретатор автоматически выполнил преобразование к необходимому типу:
console.log(10 + » машин»); // «10 машин». Число неявно преобразуется в строку
console.log(‘7’ * ‘4’); // 28. Обе строки неявно преобразуются в числа
Явные и не явные преобразования в Java
Неявное преобразование возникает тогда, когда интерпретатор выполняет преобразования типов автоматически, то есть без участия человека.
Явное преобразование – это когда за процессом преобразования стоит сам программист. Еще явное преобразование могут называть приведением типов:
console.log(‘7’ * ‘4’); // 28. Неявное преобразование
console.log(Number(‘7’) * Number(‘4’)); // 28. Явное преобразование
Как происходит преобразование значений из одного типа в другой? Для наглядности приведем таблицу. Пустые ячейки соответствуют ситуациям, когда преобразование не нужно:
Значение | Преобразование в: | |||
Строку | Число | Булево | Объект | |
undefined null | «undefined» «null» | NaN 0 | false false | ошибка typeError ошибка typeError |
true false | «true» «false» | 1 0 | newBoolean(true) newBoolean(false) | |
«» (пустая строка) «1.2» «one» «-10» «+10» «011» «0xff» | 0 1.2 NaN -10 10 11 255 | false true true true true true true | newString(«») newString(«1.2») newString(«one») newString(«-10») newString(«+10») newString(«011») newString(«0xff») | |
0 -0 NaN Infinity -Infinity 3 | «0» «0» «NaN» «Infinity» «-Infinity» «3» | false false false true true true | newNumber(0) newNumber(-0) newNumber(NaN) newNumber(Infinity) newNumber(-Infinity) newNumber(3) | |
{} (любой объект) [] (пустой массив) | см. Преобразование объектов «» | см. Преобразование объектов 0 9 NaN NaN | true true |
Функции Boolean(), Number(), String() используются для явного преобразования в простые типы. При неявном интерпретатор применяет точно такие же функции.
Но для явного преобразования вместо функций могут использоваться операторы. Представьте, если один из операндов оператора + является строкой, тогда другой операнд тоже преобразуется в строку. Унарный оператор + преобразует свой операнд в число. Унарный оператор ! преобразует операнд в логическое значение, после чего инвертирует его. Все это – причина появления следующих способов преобразования типов (они довольно часто встречаются на практике):
x + «» // То же, что и String(x)
+x // То же, что и Number(x). Можно также встретить x — 0
!!х // То же, что и Boolean(x)
Преобразование в числа
Функция Number() преобразует значения следующим образом:
- Логические значения true и false преобразуются в 1 и 0.
- Числа возвращаются без всякого изменения.
- Значение null преобразуется в 0.
- Значение undefined преобразуется в NaN.
Особые правила, которые действуют для строк:
- В том случае, если строка содержит лишь цифры с начальным знаком – или + либо без знака, она преобразуется в целое десятичное число. При этом начальные нули игнорируются, к примеру, «0011» преобразуется в 11.
- Если строка выступает числом с плавающей точкой с начальным знаком – или + (или без знака), она будет преобразована в соответствующее число с плавающей точкой (игнорируются начальные нули).
- Если строка выступает числом в шестнадцатеричном формате, она преобразуется в соответствующее целое десятичное число.
- Пустая строка преобразуется в 0.
- Если строка включает что-то отличное от приведенных выше вариантов, то она будет преобразована в NaN.
- Для объектов вызывается метод valueOf(), а возвращаемое им значение преобразуется по предыдущим правилам автоматически. Если это преобразование даёт в результате NaN, вызывается метод toString() и используются правила преобразования строк в числа.
Унарные операторы – и + работают по таким же правилам, что и функция Number().
Преобразование в булевы значения
Boolean() преобразует значение в его логический эквивалент:
- Следующие значения в результате преобразования дают значение false: undefined, null, 0, -0, NaN, «».
- Значение false возвращается без всякого изменения.
- Другие значения дают значение true.
Преобразование в строки
String() преобразует значения по такому принципу:
- Для всех значений кроме undefined и nullавтоматически вызывается метод toString(), а также возвращается строковое представление значения.
- Для значения undefined возвращается строка «undefined».
- Для значения null возвращается строка «null».
Преобразование простых типов в объекты
За преобразования простых значений в объекты отвечают конструкторы Boolean(), Number(), String():
varoNum = newNumber(3);
varoStr = newString(«1.2»);
varoBool = newBoolean(true);alert(typeofoNum); // «object»
alert(typeofoStr); // «object»
alert(typeofoBool); // «object»
Преобразование объектов в простые значения
Для объектов используется два метода преобразования: valueOf() и toString(). Метод toString() возвращает строковое представление объекта. По умолчанию метод ничего интересного не возвращает:
alert({x: 1}.toString()); // «[objectObject]»
Определенные типы имеют более специализированные версии toString(). К примеру, метод toString() у массива преобразует все его элементы в строки, после чего объединяет их в одну строку, выставив между ними запятые:
alert([1,2,3].toString()); // «1,2,3»
Цель метода valueOf() определена не настолько четко: есть версия, что он должен преобразовать объект в простое значение, представляющее его, если такое значение существует. По своей сути объекты – это составные значения, и большинство из них не могут быть представлены в виде единственного простого значения, так как метод valueOf() по умолчанию возвращает не простое число, а ссылку, ведущую на него:
alert(typeof{x:2}.valueOf()); // «object»
При преобразовании объекта в строку интерпретатор выполняет следующее:
- Если объект содержит метод toString(), то интерпретатор вызывает его. Если он возвращает простое значение, то интерпретатор преобразует значение в строку и возвращает результат преобразования.
- Если объект не имеет метода toString() или данный метод не возвращает простое значение, то интерпретатор проверяет присутствует ли метод valueOf(). Если данный метод определён, интерпретатор его вызывает. Если он возвращает простое значение, интерпретатор преобразует данное значение в строку (при условии, если оно не является строкой) и возвращает результат преобразования.
- В другом случае интерпретатор делает вывод, что ни valueOf()ни toString() не позволяют получить простое значение и провоцирует ошибку TypeError.
При преобразовании объекта в число интерпретатор производит такие же действия, но первым пытается использовать метод valueOf():
- Если объект имеет метод valueOf(), который возвращает ростое значение, интерпретатор преобразует это значение в число (при необходимости) и возвращает результат.
- Если объект не имеет метода valueOf() или данный метод не возвращает простое значение, то интерпретатор проверяет присутствие метода toString(). Если объект имеет метод toString(), возвращающий простое значение, интерпретатор выполняет преобразование и возвращает полученное значение.
- В ином случае интерпретатор делает вывод, что ни valueOf()ни toString() не позволяют получить простое значение и вызывает ошибку TypeError.
Методы valueOf() и toString()доступны для чтения и записи, поэтому их можно переопределить и явно указать, что возвратится при преобразовании:
varobj = {};
obj.toString = function() { return»объект»; };
alert(«Это «+ obj); // «Это объект»
Получилось ли у вас освоить преобразование типов данных на Java? Помог ли вам наш материал?Поделитесь опытом в комментариях.