JavaScript divide los distintos tipos de variables en dos grupos: tipos primitivos y tipos de referencia o clases.
Tipos primitivos
JavaScript define cinco tipos primitivos: undefined, null,  boolean, number y string. Además  de estos tipos, JavaScript define el operador typeof para  averiguar el tipo de una variable.
El operador typeof
El operador typeof se emplea para determinar el tipo de  dato que almacena una variable. Su uso es muy sencillo, ya que sólo es  necesario indicar el nombre de la variable cuyo tipo se quiere  averiguar:
var variable1 = 7; typeof variable1; // "number" var variable2 = "hola mundo"; typeof variable2; // "string"
Los posibles valores de retorno del operador son: undefined,  boolean, number, string para  cada uno de los tipos primitivos y object para los valores  de referencia y también para los valores de tipo null.
Variables de tipo undefined
El tipo undefined corresponde a las variables que han  sido definidas y todavía no se les ha asignado un valor:
var variable1; typeof variable1; // devuelve "undefined"
El operador typeof no distingue entre las variables  declaradas pero no inicializadas y las variables que ni siquiera han  sido declaradas:
var variable1; typeof variable1; // devuelve "undefined", aunque la variable1 ha sido declarada typeof variable2; // devuelve "undefined", la variable2 no ha sido declarada
Variables de tipo null
Se trata de un tipo similar a undefined, y de hecho en  JavaScript se consideran iguales (undefined == null). El  tipo null se suele utilizar para representar objetos que en  ese momento no existen.
var nombreUsuario = null;
Variables de tipo boolean
Además de variables de tipo boolean, también se suelen llamar variables lógicas y variables booleanas. Se trata de una variable que sólo puede almacenar uno de los dos valores especiales definidos y que representan el valor «verdadero» y el valor «falso».
var variable1 = true; var variable2 = false;
Los valores true y false son valores  especiales, de forma que no son palabras ni números ni ningún otro tipo  de valor. Este tipo de variables son esenciales para crear cualquier  aplicación, tal y como se verá más adelante.
Cuando es necesario convertir una variable numérica a una variable de  tipo boolean, JavaScript aplica la siguiente conversión:  el número 0 se convierte en false y cualquier  otro número distinto de 0 se convierte en true.
Por este motivo, en ocasiones se asocia el número 0 con  el valor false y el número 1 con el valor true.  Sin embargo, es necesario insistir en que true y false son valores especiales que no se corresponden ni con números ni con  ningún otro tipo de dato.
Variables de tipo numérico
Las variables numéricas son muy utilizadas en las aplicaciones  habituales, ya que permiten almacenar cualquier valor numérico. Si el  número es entero, se indica directamente. Si el número es decimal, se  debe utilizar el punto (.) para separar la parte entera de  la decimal.
var variable1 = 10; var variable2 = 3.14159265;
Además del sistema numérico decimal, también se pueden indicar  valores en el sistema octal (si se incluye un cero delante del número) y  en sistema hexadecimal (si se incluye un cero y una x delante del número).
var variable1 = 10; var variable_octal = 034; var variable_hexadecimal = 0xA3;
JavaScript define tres valores especiales muy útiles cuando se  trabaja con números. En primer lugar se definen los valores Infinity y –Infinity para representar números demasiado grandes  (positivos y negativos) y con los que JavaScript no puede trabajar.
var variable1 = 3, variable2 = 0; alert(variable1/variable2); // muestra "Infinity"
El otro valor especial definido por JavaScript es NaN,  que es el acrónimo de «Not a Number». De esta forma, si se  realizan operaciones matemáticas con variables no numéricas, el  resultado será de tipo NaN.
Para manejar los valores NaN, se utiliza la función  relacionada isNaN(), que devuelve true si el  parámetro que se le pasa no es un número:
var variable1 = 3; var variable2 = "hola"; isNaN(variable1); // false isNaN(variable2); // true isNaN(variable1 + variable2); // true
Por último, JavaScript define algunas constantes matemáticas que representan valores numéricos significativos:
| Constante | Valor | Significado | 
|---|---|---|
| Math.E | 2.718281828459045 | Constante de Euler, base de los logaritmos naturales y también llamado número e | 
| Math.LN2 | 0.6931471805599453 | Logaritmo natural de 2 | 
| Math.LN10 | 2.302585092994046 | Logaritmo  natural de 10 | 
| Math.LOG2E | 1.4426950408889634 | Logaritmo en base 2deMath.E | 
| Math.LOG10E | 0.4342944819032518 | Logaritmo en base 10deMath.E | 
| Math.PI | 3.141592653589793 | Pi, relación entre el radio de una circunferencia y su diámetro | 
| Math.SQRT1_2 | 0.7071067811865476 | Raíz cuadrada de 1/2 | 
| Math.SQRT2 | 1.4142135623730951 | Raíz cuadrada de 2 | 
De esta forma, para calcular el área de un círculo de radio r,  se debe utilizar la constante que representa al número Pi:
var area = Math.PI * r * r;
Variables de tipo cadena de texto
Las variables de tipo cadena de texto permiten almacenar cuaquier  sucesión de caracteres, por lo que se utilizan ampliamente en la mayoría  de aplicaciones JavaScript. Cada carácter de la cadena se encuentra en  una posición a la que se puede acceder individualmente, siendo el primer  carácter el de la posición 0.
El valor de las cadenas de texto se indica encerrado entre comillas simples o dobles:
var variable1 = "hola"; var variable2 = 'mundo'; var variable3 = "hola mundo, esta es una frase más larga";
Las cadenas de texto pueden almacenar cualquier carácter, aunque  algunos no se pueden incluir directamente en la declaración de la  variable. Si por ejemplo se incluye un ENTER para mostrar  el resto de caracteres en la línea siguiente, se produce un error en la  aplicación:
var variable = "hola mundo, esta es una frase más larga";
La variable anterior no está correctamente definida y se producirá un error en la aplicación. Por tanto, resulta evidente que algunos caracteres especiales no se pueden incluir directamente. De la misma forma, como las comillas (doble y simple) se utilizan para encerrar los contenidos, también se pueden producir errores:
var variable1 = "hola 'mundo'"; var variable2 = 'hola "mundo"'; var variable3 = "hola 'mundo', esta es una "frase" más larga";
Si el contenido de texto tiene en su interior alguna comilla simple,  se encierran los contenidos con comillas dobles (como en el caso de la variable1 anterior). Si el contenido de texto tiene en su interior alguna comilla  doble, se encierran sus contenidos con comillas simples (como en el  caso de la variable2 anterior). Sin embargo, en el caso de  la variable3 su contenido tiene tanto comillas simples como  comillas dobles, por lo que su declaración provocará un error.
Para resolver estos problemas, JavaScript define un mecanismo para  incluir de forma sencilla caracteres especiales (ENTER, Tabulador)  y problemáticos (comillas). Esta estrategia se denomina «mecanismo  de escape», ya que se sustituyen los caracteres problemáticos por  otros caracteres seguros que siempre empiezan con la barra \:
| Si se quiere incluir… | Se debe sustituir por… | 
|---|---|
| Una nueva línea | \n | 
| Un tabulador | \t | 
| Una comilla simple | \‘ | 
| Una comilla doble | \" | 
| Una barra inclinada | \\ | 
Utilizando el mecanismo de escape, se pueden corregir los ejemplos anteriores:
var variable = "hola mundo, esta es \n una frase más larga"; var variable3 = "hola 'mundo', esta es una \"frase\" más larga";
Conversión entre tipos de variables
JavaScript es un lenguaje de programación «no tipado», lo que significa que una misma variable puede guardar diferentes tipos de datos a lo largo de la ejecución de la aplicación. De esta forma, una variable se podría inicializar con un valor numérico, después podría almacenar una cadena de texto y podría acabar la ejecución del programa en forma de variable booleana.
No obstante, en ocasiones es necesario que una variable almacene un dato de un determinado tipo. Para asegurar que así sea, se puede convertir una variable de un tipo a otro, lo que se denomina typecasting:
Así, JavaScript incluye un método llamado toString() que  permite convertir variables de cualquier tipo a variables de cadena de  texto, tal y como se muestra en el siguiente ejemplo:
var variable1 = true; variable1.toString(); // devuelve "true" como cadena de texto var variable2 = 5; variable2.toString(); // devuelve "5" como cadena de texto
JavaScript también incluye métodos para convertir los valores de las  variables en valores numéricos. Los métodos definidos son parseInt() y parseFloat(), que convierten la variable que se le  indica en un número entero o un número decimal respectivamente.
La conversión numérica de una cadena se realiza carácter a carácter  empezando por el de la primera posición. Si ese carácter no es un  número, la función devuelve el valor NaN. Si el primer  carácter es un número, se continúa con los siguientes caracteres  mientras estos sean números.
var variable1 = "hola"; parseInt(variable1); // devuelve NaN var variable2 = "34"; parseInt(variable2); // devuelve 34 var variable3 = "34hola23"; parseInt(variable3); // devuelve 34 var variable4 = "34.23"; parseInt(variable4); // devuelve 34
En el caso de parseFloat(), el comportamiento es el  mismo salvo que también se considera válido el carácter . que indica la parte decimal del número:
var variable1 = "hola"; parseFloat(variable1); // devuelve NaN var variable2 = "34"; parseFloat(variable2); // devuelve 34.0 var variable3 = "34hola23"; parseFloat(variable3); // devuelve 34.0 var variable4 = "34.23"; parseFloat(variable4); // devuelve 34.23
Tipos de referencia
Aunque JavaScript no define el concepto de clase, los tipos de  referencia se asemejan a las clases de otros lenguajes de programación.  Los objetos en JavaScript se crean mediante la palabra reservada new y el nombre de la clase que se va a instanciar. De esta forma,  para crear un objeto de tipo String se indica lo siguiente  (los paréntesis solamente son obligatorios cuando se utilizan  argumentos, aunque se recomienda incluirlos incluso cuando no se  utilicen):
var variable1 = new String("hola mundo");
JavaScript define una clase para cada uno de los tipos de datos  primitivos. De esta forma, existen objetos de tipo Boolean para las variables booleanas, Number para las variables  numéricas y String para las variables de cadenas de texto.  Las clases Boolean, Number y String almacenan los mismos valores de los tipos de datos primitivos y añaden  propiedades y métodos para manipular sus valores.
Aunque más adelante se explica en detalle, el siguiente ejemplo determina el número de caracteres de una cadena de texto:
var longitud = "hola mundo".length;
La propiedad length sólo está disponible en la clase String,  por lo que en principio no debería poder utilizarse en un dato  primitivo de tipo cadena de texto. Sin embargo, JavaScript convierte el  tipo de dato primitivo al tipo de referencia String,  obtiene el valor de la propiedad length y devuelve el  resultado. Este proceso se realiza de forma automática y transparente  para el programador.
En realidad, con una variable de tipo String no se  pueden hacer muchas más cosas que con su correspondiente tipo de dato  primitivo. Por este motivo, no existen muchas diferencias prácticas  entre utilizar el tipo de referencia o el tipo primitivo, salvo en el  caso del resultado del operador typeof y en el caso de la  función eval(), como se verá más adelante.
La principal diferencia entre los tipos de datos es que los datos primitivos se manipulan por valor y los tipos de referencia se manipulan, como su propio nombre indica, por referencia. Los conceptos «por valor» y «por referencia» son iguales que en el resto de lenguajes de programación, aunque existen diferencias importantes (no existe por ejemplo el concepto de puntero).
Cuando un dato se manipula por valor, lo único que importa es el valor en sí. Cuando se asigna una variable por valor a otra variable, se copia directamente el valor de la primera variable en la segunda. Cualquier modificación que se realice en la segunda variable es independiente de la primera variable.
De la misma forma, cuando se pasa una variable por valor a una función (como se explicará más adelante) sólo se pasa una copia del valor. Así, cualquier modificación que realice la función sobre el valor pasado no se refleja en el valor de la variable original.
En el siguiente ejemplo, una variable se asigna por valor a otra variable:
var variable1 = 3; var variable2 = variable1; variable2 = variable2 + 5; // Ahora variable2 = 8 y variable1 sigue valiendo 3
La variable1 se asigna por valor en la variable1.  Aunque las dos variables almacenan en ese momento el mismo valor, son  independientes y cualquier cambio en una de ellas no afecta a la otra.  El motivo es que los tipos de datos primitivos siempre se asignan (y se  pasan) por valor.
Sin embargo, en el siguiente ejemplo, se utilizan tipos de datos de referencia:
var variable1 = new Date(2009, 11, 25); // variable1 = 25 diciembre de 2009 var variable2 = variable1; // variable2 = 25 diciembre de 2009 variable2.setFullYear(2010, 11, 31); // variable2 = 31 diciembre de 2010 // Ahora variable1 también es 31 diciembre de 2010
En el ejemplo anterior, se utiliza un tipo de dato primitivo que se  verá más adelante, que se llama Date y que se utiliza para  manejar fechas. Se crea una variable llamada variable1 y se  inicializa la fecha a 25 de diciembre de 2009. Al constructor del  objeto Date se le pasa el año, el número del mes (siendo 0 = enero, 1 = febrero, …, 11 = diciembre) y  el día (al contrario que el mes, los días no empiezan en 0 sino en 1). A continuación, se asigna el valor de la variable1 a otra variable llamada variable2.
Como Date es un tipo de referencia, la asignación se  realiza por referencia. Por lo tanto, las dos variables quedan «unidas» y  hacen referencia al mismo objeto, al mismo dato de tipo Date.  De esta forma, si se modifica el valor de variable2 (y se  cambia su fecha a 31 de diciembre de 2010) el valor de variable1 se verá automáticamente modificado.
Variables de tipo Object
La clase Object por sí sola no es muy útil, ya que su  única función es la de servir de base a partir de la cual heredan el  resto de clases. Los conceptos fundamentales de los objetos son los  constructores y la propiedad prototype, tal y como se  explicarán en el siguiente capítulo.
Una utilidad práctica de Object es la conversión entre  tipos de datos primitivos y sus correspondientes tipos de referencia:
var numero = new Object(5);             // numero es de tipo Number
var cadena = new Object("hola mundo");  // cadena es de tipo String
var conectado = new Object(false);      // conectado es de tipo Boolean
Variables de tipo Boolean
Utilizando el tipo de referencia Boolean, es posible  crear objetos de tipo lógico o booleano:
var variable1 = new Boolean(false);
Sin embargo, en general no se utilizan objetos de tipo Boolean porque su comportamiento no siempre es idéntico al de los tipos de  datos primitivos:
var variable1 = true, variable2 = false; var variable3 = new Boolean(false); variable2 && variable1; // el resultado es false variable3 && variable1; // el resultado es true
El resultado de la última operación es realmente sorprendente, ya que  se esperaba un resultado false. El problema reside en que  los objetos no se comportan igual que los tipos primitivos. En una  operación lógica, cualquier objeto que exista se convierte a true,  independientemente de su valor.
Por este motivo, con los valores booleanos normalmente se utilizan  tipos de datos primitivos en vez de objetos de tipo Boolean.
Variables de tipo Number
La clase Number permite definir variables de tipo  numérico independientemente de si el valor es entero o decimal:
var variable1 = new Number(16); var variable2 = new Number(3.141592);
Para obtener el valor numérico almacenado, se puede utilizar el  método valueOf():
var variable1 = new Number(16); var variable2 = variable1.valueOf(); // variable2 = 16
Uno de los métodos más útiles para los números es toFixed(),  que trunca el número de decimales de un número al valor indicado como  parámetro:
var variable1 = new Number(3.141592); var variable2 = variable1.toFixed(); // variable2 = 3 var variable3 = variable1.toFixed(2); // variable3 = 3.14 var variable4 = variable1.toFixed(10); // variable4 = 3.1415920000
En ocasiones, el método toFixed() no funciona como  debería, debido a los problemas que sufren la mayoría de lenguajes de  programación con los números decimales (en realidad, se denominan «números  de coma flotante»):
var numero1 = new Number(0.235); var numero2 = new Number(1.235); numero3 = numero1.toFixed(2); // numero3 = 0.23 numero3 = numero2.toFixed(2); // numero3 = 1.24
Como se ve en el ejemplo anterior, el redondeo de los decimales no  funciona de forma consistente, ya que el número 5 a veces  incrementa el decimal anterior y otras veces no. De la misma forma, se  pueden producir errores de precisión en operaciones aparentemente  sencillas, como en la siguiente multiplicación:
var numero1 = new Number(162.295); var numero2 = numero1 * new Number(100); // numero2 no es igual a 16229.5 // numero2 = 16229.499999999998
Los errores de redondeo afectan de la misma forma a las variables  numéricas creadas con tipos de datos primitivos. En cualquier caso, al  igual que sucede con Boolean, se recomienda utilizar el  tipo de dato primitivo para los números, ya que la clase Number no aporta mejoras significativas.
Variables de tipo String
La clase String representa una cadena de texto, de  forma similar a los tipos de datos primitivos:
var variable1 = new String("hola mundo");
El objeto de tipo String es el más complejo de  JavaScript y contiene decenas de métodos y utilidades, algunos de los  cuales se verán más adelante. Como ya se ha comentado, siempre que sea  necesario JavaScript convierte de forma automática las cadenas de texto  de dato primitivo a dato de referencia. De esta forma, no es obligatorio  crear objetos de tipo String para acceder a todas las  utilidades disponibles para las cadenas de texto.
Operador instanceof
El operador typeof no es suficiente para trabajar con  tipos de referencia, ya que devuelve el valor object para  cualquier objeto independientemente de su tipo. Por este motivo,  JavaScript define el operador instanceof para determinar la  clase concreta de un objeto.
var variable1 = new String("hola mundo");
typeof variable1;             // devuelve "object"
variable1 instanceof String;  // devuelve true
El operador instanceof sólo devuelve como valor true o false. De esta forma, instanceof no  devuelve directamente la clase de la que ha instanciado la variable,  sino que se debe comprobar cada posible tipo de clase individualmente.
Publicado el 28 Feb, 2011