Преобразование типов
Обновлен: Ноябрь 2007
Преобразование типов — это процесс изменения типа значения. Например, можно преобразовать строку "1234" в число. Кроме того, можно преобразовать данные любого типа в тип String. Преобразование некоторых типов невозможно. Например, объект Date нельзя преобразовать в объект ActiveXObject.
Преобразование типов бывает расширяющим или сужающим: при расширяющих преобразованиях переполнение никогда не происходит и они всегда выполняются успешно, тогда как при сужающих преобразованиях может произойти потеря сведений и сбой.
В обоих случаях преобразование может быть явным (с идентификатором типа данных) или неявным (без идентификатора). Допустимые явные преобразования всегда выполняются успешно, даже если при этом происходит потеря данных. Неявные преобразования считаются успешными только в случае, если данные не потеряны; в противном случае преобразования оканчиваются сбоем и создаются ошибки компиляции или во время выполнения.
Преобразование с потерей точности происходит, когда для данных исходного типа не существует явного аналога в конечном типе. Например, строку "Fred" нельзя преобразовать в число. В этих случаях функция преобразования типов возвращает значение по умолчанию. Для типа Number значение по умолчанию — NaN; для типа int значение по умолчанию — нуль.
В некоторых случаях, например при преобразовании строк в числа, это занимает немало времени. Чем меньше преобразований применяется в программе, тем быстрее она работает.
Неявные преобразования
В большинстве случаев преобразование типов, например, при присвоении значения переменной, происходит автоматически. Тип данных переменной определяет тип данных преобразования выражения.
В этом примере показано неявное преобразование данных между типами int, String и double.
var i : int;
var d : double;
var s : String;
i = 5;
s = i; // Widening: the int value 5 coverted to the String "5".
d = i; // Widening: the int value 5 coverted to the double 5.
s = d; // Widening: the double value 5 coverted to the String "5".
i = d; // Narrowing: the double value 5 coverted to the int 5.
i = s; // Narrowing: the String value "5" coverted to the int 5.
d = s; // Narrowing: the String value "5" coverted to the double 5.
При компиляции этого кода могут возникнуть предупреждения о том, что сужающие преобразования могут окончиться сбоем или замедлить работу программы.
Сужающие неявные преобразования обычно могут не работать, если при преобразовании будут утрачены данные. Например, следующий код не будет работать.
var i : int;
var f : float;
var s : String;
f = 3.14;
i = f; // Run-time error. The number 3.14 cannot be represented with an int.
s = "apple";
i = s; // Run-time error. The string "apple" cannot be converted to an int.
Явные преобразования
Чтобы явным образом преобразовать выражение в определенный тип данных, используйте идентификатор этого типа, а за ним в скобках — выражение, которое нужно преобразовать. Для явного преобразования требуется написание большего объема кода, но в данном случае выше вероятность успешного результата. Кроме того, явное преобразование можно использовать в случаях, когда вероятна потеря точности.
В этом примере показано явное преобразование данных между типами int, String и double.
var i : int;
var d : double;
var s : String;
i = 5;
s = String(i); // Widening: the int value 5 coverted to the String "5".
d = double(i); // Widening: the int value 5 coverted to the double 5.
s = String(d); // Widening: the double value 5 coverted to the String "5".
i = int(d); // Narrowing: the double value 5 coverted to the int 5.
i = int(s); // Narrowing: the String value "5" coverted to the int 5.
d = double(s); // Narrowing: the String value "5" coverted to the double 5.
Сужающие явные преобразования обычно работают даже в том случае, при преобразовании будут утрачены данные. Явное преобразование невозможно между несовместимыми типами данных. Например, преобразование данных между типами Date и RegExp невозможно. Кроме того, нельзя преобразовать некоторые значения, поскольку не существует конечного значения. Например, при попытке явного преобразования двойного значения NaN в тип decimal возникает ошибка. Ошибка возникает из-за того, что не существует такого значения decimal, которое бы соответствовало значению NaN.
В данном примере число с десятичной частью преобразуется в целое число и строка также преобразуется в целое число.
var i : int;
var d : double;
var s : String;
d = 3.14;
i = int(d);
print(i);
s = "apple";
i = int(s);
print(i);
Результат получается следующим:
3
0
Результат явного преобразования зависит от исходного и конечного типов данных.