Tipos de Datos en JavaScript.
Tipos de Datos en JavaScript.
Tipos primitivos y
objeto. Significado de undefined, null, NaN.
Ejemplos (CU01112E)
Escrito por Csar Krall
Resumen:
Entrega
n12: Orientacin
programador web: JavaScript desde cero".
sobre
el
curso "Tutorial
bsico
del
Los tipos objeto son datos interrelacionados, no ordenados, donde existe un nombre de objeto y
un conjunto de propiedades que tienen un valor. Un objeto puede ser creado especficamente por
el programador. No obstante, se dice que todo aquello que no es un tipo primitivo es un objeto y
en este sentido tambin es un objeto, por ejemplo, una funcin. Lo estudiaremos ms adelante.
Existen algunos objetos especiales con un comportamiento que estudiaremos por separado
ms adelante: el objeto global, el objeto prototipo, los arrays, las funciones, las clases
definidas por el programador, las clases predefinidas JavaScript (como la clase Date para manejo
de fechas, la clase RegExp para manejo de expresiones regulares y bsqueda de patrones en
texto, y la clase Error para almacenar informacin relacionada con los errores) y otros.
Los primeros lenguajes de programacin no usaban objetos, solo variables. Una variable
podramos decir que es un espacio de la memoria del ordenador a la que asignamos un
contenido que puede ser bsicamente un valor numrico (slo nmeros, con su valor de clculo)
o de tipo carcter o cadena de caracteres (valor alfanumrico que constar slo de texto o de
texto mezclado con nmeros).
Como ejemplo podemos definir una variable a que contenga 32 y esto lo escribimos como a =
32. Posteriormente podemos cambiar el valor de a y hacer a = 78. O hacer a equivalente al
valor de otra variable b as: a = b.
Dado que antes hemos dicho que un objeto tambin ocupa un espacio de memoria: en qu se
parecen y en qu se diferencia un objeto de una variable? Consideraremos que las variables son
entidades elementales: un nmero, un carcter, un valor verdadero o falso mientras que los
objetos son entidades complejas que pueden estar formadas por mucha informacin. Pero ambas
cosas ocupan lo mismo: un espacio de memoria (que puede ser ms o menos grande).
El siguiente esquema es un resumen sobre tipos de datos en JavaScript.
TIPOS DE
DATOS EN
NOMBRE
DESCRIPCIN
aprenderaprogramar.com
TIPOS
PRIMITIVOS
String
Cadenas de texto
Number
Valores numricos
Boolean
true false
Null
Undefined
Tipos
predefinidos
de JavaScript
JAVASCRIPT
TIPOS
OBJETO
Tipos
definidos por
el
programador /
usuario
Arrays
Date (fechas)
RegExp (expresiones regulares)
Error (datos de error)
Funciones simples
Clases
Objetos
especiales
Objeto prototipo
Otros
No te preocupes ahora por conocer todos los posibles tipos de datos de JavaScript ni su
significado. Los iremos estudiando y trabajando con ellos poco a poco.
Frente a otros lenguajes fuertemente tipados (las variables tienen un tipo declarado y no pueden
cambiar
el
tipo
de
contenido
que
almacenan)
como
Java,
JavaScript
es
un
un
lenguaje dbilmente tipado: las variables pueden no ser de un tipo especfico y cambiar el tipo
de contenido que almacenan.
Expresiones simples
Una expresin regular se construye con una cadena de texto que representa el formato que debe
cumplir el texto. En javascript se puede hacer de dos formas, bien instanciando una clase RegExp
pasndo como parmetro la cadena de formato, bien poniendo directamente la cedena de formato,
en vez de entre comillas, entre /
?
3// devuelve un array de 1 elemento ["javascript"], indicando que s existe esa cadena d
4
5"adios tu".match(reg);
6// devuelve null, indicando que no existe javascript dentro de "adios tu".
1"hola javascript".match(/javascript/);
2// Devuelve ["javascript"]
Y para verificar si existe o no la cadena, podemos poner directamente un if
?
// Pasar por aqu, porque un array con un elemento se evalua como true en el if
3}
4
5if ("adios tu".match(/javascript/) {
6
7}
1"esto es un *".match(/\*/);
2// Devuelve ["*"] indicando que existe un asterisco.
1"aa2bb".match(/[0-9]/);
Podemos hacer lo contrario, es decir, que la letra no est en ese conjunto de caracteres. Se hace
poniendo el juego de caracteres que no queremos entre [^ y ]. Por ejemplo, para no dgitos
pondramos [^0-9]
?
Conjuntos habituales
Hay varios conjuntos que se usan con frecuencia, como el de letras [a-zA-Z], el de dgitos [0-9] o el
de espacios en blanco (espacio, tabulador, etc). Para estos conjuntos la expresin regular define
formas abreviadas, como
Por ejemplo
?
Repeticin de caracteres
Podemos querer buscar por ejemplo un conjunto de tres digitos, podemos hacerlo repitiendo tres
veces el \d
?
1"aa123bb".match(/\d\d\d/);
pero esta forma es un poco engorrosa si hay muchos caracteres y es poco verstil. Las
expresiones regulares nos permiten poner entre {} un rango de veces que debe repetirse. por
ejemplo
/\d{3}/
/\d{1,5}/
/\d{2,}/
como ejemplos
?
1"1234".match(/\d{2}/);
2["12"]
3
4"1234".match(/\d{1,3}/);
5["123"]
6
7"1234".match(/\d{3,10}/)
8["1234"]
Tambin suele haber rangos habituales como 0 o ms veces, 1 o ms veces, 0 1 vez. Estos
rangos habituales tienen caracteres especiales que nos permiten ponerlos de forma ms simple.
Por ejemplo
?
1"a2a".match(/a\d+a/);
// Encuentra a2a
2"a234a".match(/a\d+a/);
// Encuentra a234a
Cosas como * o + encuentran el mximo posible de caracteres. Por ejemplo, si nuestro patrn es
/a+/ y nuestra cadena es "aaaaa", el resultado ser todo la cadena
?
1"aaaaa".match(/a+/);
// Devuelve ["aaaaa"]
Para hacer que se encuentre lo menos posible, se pone un ? detrs. As por ejemplo, si nuestra
expresin regular es /a+?/ y nuestra cadena es "aaaaa", slo se encontrar una "a"
?
1"aaaaa".match(/a+?/);
// Devuelve ["aaaaa"]
El comportamiento inicial se conoce como "greedy" o codicioso, en el que el patrn intenta coger la
mayor parte de la cadena de texto posible. En segundo comportamiento se conoce como
"nongreedy" o no codicioso, en el que el patrn coge lo menos posible de la cadena.
1/\d{1,2}\/\d{1,2}\/\d{4}/
suponiendo que el da y el mes puedan tener una cifra y que el ao sea obligatoriamente de 4
cifras. En este caso
1"27/11/2012".match(/\d{1,2}\/\d{1,2}\/\d{4}/);
nos devuelve un array con un nico elemento que es la cadena "27/11/2012". Para extraer los
trozos, nicamente debemos poner entre parntesis en la expresin regular aquellas partes que
nos interesan. Es decir,
?
1/(\d{1,2})\/(\d{1,2})\/(\d{4})/
Si ahora ejecutamos el mtodo match() con la misma cadena anterior, obtendremos un array de 4
cadenas. La primera es la cadena completa que cumple la expresin regular. Los otros tres
elementos son lo que cumple cada uno de los parntesis
?
1"27/11/2012".match(/(\d{1,2})\/(\d{1,2})\/(\d{4})/);
// Devuelve el array
1"xyxyxyxy".match(/(xy)+/);
Ignorar lo encontrado
A veces nos interesa encontrar una secuencia que se repita varias veces seguidas y la forma de
hacerlo es con los parntesis, por ejemplo, si ponemos /(pa){2}/ estamos buscando "papa". Para
evitar que esos parntesis guarden lo encontrado en \1, podemos poner ?:, tal que as /(?:pa){2}/,
de esta forma encontraremos "papa", pero se nos devolver el trozo "pa" encontrado ni lo
tendremos disponible en \1. Compara las dos siguientes
?
1"papa".match(/(pa){2}/);
2"papa".match(/(?:pa){2}/);
// Devuelve ["papa"]
Posicin de la expresin
A veces nos interesa que la cadena busque en determinadas posiciones. Las expresiones
regulares nos ofrecen algunos caracteres espaciales para esto.
^ indica el principo de cadena, por ejemplo, /^hola/ vale si la cadena "hola" est al principio
?
1"hola tu".match(/^hola/);
// Devuelve ["hola"]
// Devuelve null
1"hola tu".match(/tu$/);
// Devuelve ["tu"]
2"hola tu turur".match(/tu$/);
// Devuelve null
\b indica una frontera de palabra, es decir, entre un caracter "letra" y cualquier otra cosa como
espacios, fin o principio de linea, etc. De esta forma, por ejemplo, /\bjava\b/ buscar la palabra java,
pero ignorar javascript
?
1"java es gay".match(/\bjava\b/);
// Devuelve ["java"]
2"javascript es gay".match(/\bjava\b/);
// Devuelve null
\B es lo contrario de \b, as por ejemplo, /\bjava\B/ buscar una palabra que empiece por "java",
pero no sea slo java sino que tenga algo ms
?
1"java es gay".match(/\bjava\B/);
// Devuelve null
// Devuelve ["10"]
Hay que tener cuidado si buscamos detrs, porque como el trozo (?=expresion) no se tiene en
cuenta, sigue contando para el resto de la expresin. Por ejemplo, si queremos extraer la parte
decimal de "11.22" podramos pensar en hacer esto /(?=\.)\d+/ , pero no funciona porque el .
decimal no se "consume" con (?=\.), as que debemos tenerlo en cuenta y ponerlo detrs, as /(?
=\.)\.\d+/
?
(?!expresion) hace lo contrario que (?=expresion), es decir, busca una posicin donde no se
cumpla expresin. Por ejemplo, para sacar lo que no sean km de "11 km, 12 km, 14 m" podemos
poner /\d{2}(?! km)/
?
Flags de opciones
Hemos visto que una expresin regular es /expresion/. Podemos poner algunos flags detrs,
bsicamente unas letras que cambian algo el comportamiento
i es para ignorar maysculas y minsculas
?
1"hola".match(/HOLA/);
// Devuelve null
2"hola".match(/HOLA/i);
// Devuelve ["hola"]
g es para buscar todas las veces posibles la expresin, no slo una vez
?
// Devuelve ["11"]
m busca en cadenas con retornos de carro \n considerando estos como inicios de linea ^ o fin $
?
1"hola\ntu".match(/^tu/);
// Devuelve null
2"hola\ntu".match(/^tu/m);
// Devuelve ["tu"]
3"hola\ntu".match(/hola$/);
// Devuelve null
4"hola\ntu".match(/hola$/m);
// Devuelve ["hola"]
Para todos estos ejemplos hemos usado el mtodo match() de la clase String, ya que nos devuelve
un array con las cosas que se encuentran y viendo los resultados es la forma ms clara de ver
cmo funcionan las distintas partes de la expresin regular. Sin embargo, tanto String como
RegExp tienen otros mtodos tiles
String.search(/expresion/)
Devuelve la posicin donde se encuentra esa expresin dentro de la cadena, o -1 si no se
encuentra.
String.replace(/expresion/,cadena)
Busca el trozo de cadena que casa con la expresin y la reemplaza con lo que le pasemos en el
parmetro cadena. Este mtodo tiene adems un detalle intresante. Cuando en la expresin
regular tenemos parntesis para extraer algunas partes de la cadena, la misma expresin regular
recuerda qu ha encontrado. En el mtodo replace, si en la cadena de segundo parmetro
aparecen cosas como $1, $2, utilizar lo encontrado.
?
String.match(/expresion/)
Ya lo hemos visto.
String.split(/expresion/)
Usa lo que sea que case con la expresin como separador y devuelve un array con la cadena
partida en trozos por ese separador
?
RegExp constructor
Adems de crear las expresiones regulares con /expresion/flags, podemos hacerlo con un new de
la clase RegExp, por ejemplo new RegExp("expresion","flags").
?
2
"11 22 33".match(reg);
// Devuelve ["11","22","33"]
Hay que fijarse en este caso que las \ debemos escaparlas, con \\
RegExp.exec()
Es similar a match() de String, pero slo devuelve un resultado y hace que RegExp guarde la
posicin en la que lo ha encontrado. Sucesivas llamadas a exec(), nos iran devolviendo los
siguientes resultados
?
1
2
3
// Devuelve ["11"]
reg.exec("11 22 33");
4
5
6
// Devuelve ["11"]
7 reg.exec("11 22 33");
8 reg.exec("11 22 33");
9 reg.exec("11 22 33");
1 reg.exec("11 22 33");
0
RegExp.test()
Similar a exec(), pero en vez de devolver lo encontrado, devuelve true si ha encontrado algo o false
si no. Como la expresin regular recuerda las bsquedas anteriores, sucesivas llamadas a test()
pueden devolver resultados distintos
?
3reg.test("11 22 33");
4reg.test("11 22 33");
5reg.test("11 22 33");
6reg.test("11 22 33");