Conversión de tipos

La conversión de tipos es el proceso de cambiar un valor de un tipo a otro. Por ejemplo, la cadena "1234" se puede convertir a un número. Además, se puede convertir cualquier tipo de datos al tipo String. Algunas conversiones de tipo no funcionan nunca. Por ejemplo, un objeto Date no se puede convertir a un objeto ActiveXObject.

Las conversiones de tipo pueden ser de ampliación o de restricción: las conversiones de ampliación nunca producen desbordamiento y siempre son correctas, mientras que las conversiones de restricción suponen una posible pérdida de información y pueden producir errores.

Ambos tipos de conversión pueden ser explícitas (utilizando el identificador del tipo de datos) o implícitas (sin el identificador del tipo de datos). Las conversiones explícitas siempre funcionan correctamente, incluso cuando se produce una pérdida de información. Las conversiones implícitas son correctas sólo cuando no hay pérdida de datos en el proceso; en caso contrario fallan y generan un error de compilación o un error en tiempo de ejecución.

Las conversiones con pérdida de información tienen lugar cuando el tipo de datos original no tiene un análogo obvio en el tipo de destino de la conversión. Por ejemplo, la cadena "Pedro" no se puede convertir en un número. En estos casos, se devuelve un valor predeterminado de la función de conversión de tipo. Para el tipo Number, el valor predeterminado es NaN; para el tipo int, el valor predeterminado es el número cero.

Algunos tipos de conversiones, como de una cadena a un número, tardan bastante tiempo. Cuantas menos conversiones utilice el programa, más eficaz será.

Conversiones implícitas

La mayoría de las conversiones, como la asignación de un valor a una variable, se producen automáticamente. El tipo de datos de la variable determina el tipo de datos de destino de la conversión de expresión.

En el ejemplo siguiente se muestra una conversión de datos implícita entre un valor int , un valor String y un valor 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.

Cuando se compila este código, pueden aparecer advertencias en tiempo de compilación para informar de que las conversiones de restricción pueden producir errores o ser muy lentas.

Puede ocurrir que las conversiones de restricción implícitas no funcionen si la conversión requiere una pérdida de información. Por ejemplo, las siguientes líneas no funcionarán:

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.

Conversiones explícitas

Para convertir explícitamente una expresión a un tipo de datos concreto, utilice el identificador de tipo de datos seguido de la expresión que se va a convertir entre paréntesis. Las conversiones explícitas requieren más escritura que las implícitas, pero proporcionan más seguridad con respecto a los resultados. Además, las conversiones explícitas pueden controlar conversiones con pérdida de información.

En el ejemplo siguiente se muestra una conversión de datos explícita entre un valor int , un valor String y un valor 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.

Las conversiones de restricción explícitas suelen funcionar correctamente, aunque la conversión requiera una pérdida de información. La conversión explícita no se puede utilizar para convertir tipos de datos incompatibles. Por ejemplo, no se pueden convertir datos Date a datos RegExp, y viceversa. Además, algunos valores no se pueden convertir porque no existe ningún valor razonable al que se puedan convertir. Por ejemplo, se genera un error si se intenta convertir explícitamente el valor NaN de tipo double a un valor decimal. Esto es así porque no hay un valor decimal natural que se pueda identificar con NaN.

En este ejemplo, se convierte un número que tiene una parte decimal y una cadena en números enteros:

var i : int;
var d : double;
var s : String;
d = 3.14;
i = int(d);
print(i);
s = "apple";
i = int(s);
print(i);

El resultado es:

3
0

El comportamiento de la conversión explícita depende del tipo de datos originales y del tipo de datos de destino.

Vea también

Referencia

undefined (Propiedad)

Conceptos

Anotaciones de tipo

Otros recursos

Tipos de datos de JScript