Un valor en JavaScript siempre pertenece a un tipo de dato determinado. Por ejemplo, un string o un número.
Hay ocho tipos de datos básicos en JavaScript. En este capÃtulo los cubriremos en general y en los próximos hablaremos de cada uno de ellos en detalle.
Podemos almacenar un valor de cualquier tipo dentro de una variable. Por ejemplo, una variable puede contener en un momento un string y luego almacenar un número:
// no hay error
let message = "hola";
message = 123456;
Los lenguajes de programación que permiten estas cosas, como JavaScript, se denominan âdinámicamente tipadosâ, lo que significa que allà hay tipos de datos, pero las variables no están vinculadas rÃgidamente a ninguno de ellos.
Number
let n = 123;
n = 12.345;
El tipo number representa tanto números enteros como de punto flotante.
Hay muchas operaciones para números. Por ejemplo, multiplicación *, división /, suma +, resta -, y demás.
Además de los números comunes, existen los llamados âvalores numéricos especialesâ que también pertenecen a este tipo de datos: Infinity, -Infinity y NaN.
-
Infinityrepresenta el Infinito matemático â. Es un valor especial que es mayor que cualquier número.Podemos obtenerlo como resultado de la división por cero:
alert( 1 / 0 ); // InfinityO simplemente hacer referencia a él directamente:
alert( Infinity ); // Infinity -
NaNrepresenta un error de cálculo. Es el resultado de una operación matemática incorrecta o indefinida, por ejemplo:alert( "no es un número" / 2 ); // NaN, tal división es erróneaNaNes âpegajosoâ. Cualquier otra operación sobreNaNdevuelveNaN:alert( NaN + 1 ); // NaN alert( 3 * NaN ); // NaN alert( "not a number" / 2 - 1 ); // NaNPor lo tanto, si hay un
NaNen alguna parte de una expresión matemática, se propaga a todo el resultado (con una única excepción:NaN ** 0es1).
Hacer matemáticas es âseguroâ en JavaScript. Podemos hacer cualquier cosa: dividir por cero, tratar las cadenas no numéricas como números, etc.
El script nunca se detendrá con un error fatal (y âmorirâ). En el peor de los casos, obtendremos NaN como resultado.
Los valores numéricos especiales pertenecen formalmente al tipo ânúmeroâ. Por supuesto que no son números en el sentido estricto de la palabra.
Veremos más sobre el trabajo con números en el capÃtulo Números.
BigInt
En JavaScript, el tipo ânumberâ no puede representar de forma segura valores enteros mayores que (253-1) (eso es 9007199254740991), o menor que -(253-1) para negativos.
Para ser realmente precisos, el tipo de dato ânumberâ puede almacenar enteros muy grandes (hasta 1.7976931348623157 * 10308), pero fuera del rango de enteros seguros ±(253-1) habrá un error de precisión, porque no todos los dÃgitos caben en el almacén fijo de 64-bit. Asà que es posible que se almacene un valor âaproximadoâ.
Por ejemplo, estos dos números (justo por encima del rango seguro) son iguales:
console.log(9007199254740991 + 1); // 9007199254740992
console.log(9007199254740991 + 2); // 9007199254740992
Podemos decir que ningún entero impar mayor que (253-1) puede almacenarse en el tipo de dato ânumberâ.
Para la mayorÃa de los propósitos, el rango ±(253-1) es suficiente, pero a veces necesitamos números realmente grandes; por ejemplo, para criptografÃa o marcas de tiempo de precisión de microsegundos.
BigInt se agregó recientemente al lenguaje para representar enteros de longitud arbitraria.
Un valor BigInt se crea agregando n al final de un entero:
// la "n" al final significa que es un BigInt
const bigInt = 1234567890123456789012345678901234567890n;
Como los números BigInt rara vez se necesitan, no los cubrimos aquà sino que les dedicamos un capÃtulo separado <info: bigint>. Léelo cuando necesites números tan grandes.
String
Un string en JavaScript es una cadena de caracteres y debe colocarse entre comillas.
let str = "Hola";
let str2 = 'Las comillas simples también están bien';
let phrase = `se puede incrustar otro ${str}`;
En JavaScript, hay 3 tipos de comillas.
- Comillas dobles:
"Hola". - Comillas simples:
'Hola'. - Backticks (comillas invertidas):
`Hola`.
Las comillas dobles y simples son comillas âsencillasâ (es decir, funcionan igual). No hay diferencia entre ellas en JavaScript.
Los backticks son comillas de âfuncionalidad extendidaâ. Nos permiten incrustar variables y expresiones en una cadena de caracteres encerrándolas en ${...}, por ejemplo:
let name = "John";
// incrustar una variable
alert( `Hola, ${name}!` ); // Hola, John!
// incrustar una expresión
alert( `el resultado es ${1 + 2}` ); //el resultado es 3
La expresión dentro de ${...} se evalúa y el resultado pasa a formar parte de la cadena. Podemos poner cualquier cosa ahà dentro: una variable como name, una expresión aritmética como 1 + 2, o algo más complejo.
Toma en cuenta que esto sólo se puede hacer con los backticks. ¡Las otras comillas no tienen esta capacidad de incrustación!
alert( "el resultado es ${1 + 2}" ); // el resultado es ${1 + 2} (las comillas dobles no hacen nada)
En el capÃtulo Strings trataremos más a fondo las cadenas.
En algunos lenguajes, hay un tipo especial âcarácterâ para un solo carácter. Por ejemplo, en el lenguaje C y en Java es char.
En JavaScript no existe tal tipo. Sólo hay un tipo: string. Un string puede estar formado por un solo carácter, por ninguno, o por varios de ellos.
Boolean (tipo lógico)
El tipo boolean tiene sólo dos valores posibles: true y false.
Este tipo se utiliza comúnmente para almacenar valores de sÃ/no: true significa âsÃ, correcto, verdaderoâ, y false significa âno, incorrecto, falsoâ.
Por ejemplo:
let nameFieldChecked = true; // sÃ, el campo name está marcado
let ageFieldChecked = false; // no, el campo age no está marcado
Los valores booleanos también son el resultado de comparaciones:
let isGreater = 4 > 1;
alert( isGreater ); // verdadero (el resultado de la comparación es "sÃ")
En el capÃtulo Operadores Lógicos trataremos más a fondo el tema de los booleanos.
El valor ânullâ (nulo)
El valor especial null no pertenece a ninguno de los tipos descritos anteriormente.
Forma un tipo propio separado que contiene sólo el valor null:
let age = null;
En JavaScript, null no es una âreferencia a un objeto inexistenteâ o un âpuntero nuloâ como en otros lenguajes.
Es sólo un valor especial que representa ânadaâ, âvacÃoâ o âvalor desconocidoâ.
El código anterior indica que el valor de age es desconocido o está vacÃo por alguna razón.
El valor âundefinedâ (indefinido)
El valor especial undefined también se distingue. Hace un tipo propio, igual que null.
El significado de undefined es âvalor no asignadoâ.
Si una variable es declarada, pero no asignada, entonces su valor es undefined:
let age;
alert(age); // muestra "undefined"
Técnicamente, es posible asignar undefined a cualquier variable:
let age = 100;
// cambiando el valor a undefined
age = undefined;
alert(age); // "undefined"
â¦Pero no recomendamos hacer eso. Normalmente, usamos null para asignar un valor âvacÃoâ o âdesconocidoâ a una variable, mientras undefined es un valor inicial reservado para cosas que no han sido asignadas.
Object y Symbol
El tipo object (objeto) es especial.
Todos los demás tipos se llaman âprimitivosâ porque sus valores pueden contener una sola cosa (ya sea una cadena, un número, o lo que sea). Por el contrario, los objetos se utilizan para almacenar colecciones de datos y entidades más complejas.
Siendo asà de importantes, los objetos merecen un trato especial. Nos ocuparemos de ellos más adelante en el capÃtulo Objetos después de aprender más sobre los primitivos.
El tipo symbol (sÃmbolo) se utiliza para crear identificadores únicos para los objetos. Tenemos que mencionarlo aquà para una mayor integridad, pero es mejor estudiar este tipo después de los objetos.
El operador typeof
El operador typeof devuelve el tipo de dato del operando. Es útil cuando queremos procesar valores de diferentes tipos de forma diferente o simplemente queremos hacer una comprobación rápida.
La llamada a typeof x devuelve una cadena con el nombre del tipo:
typeof undefined // "undefined"
typeof 0 // "number"
typeof 10n // "bigint"
typeof true // "boolean"
typeof "foo" // "string"
typeof Symbol("id") // "symbol"
typeof Math // "object" (1)
typeof null // "object" (2)
typeof alert // "function" (3)
Las últimas tres lÃneas pueden necesitar una explicación adicional:
Mathes un objeto incorporado que proporciona operaciones matemáticas. Lo aprenderemos en el capÃtulo Números. Aquà sólo sirve como ejemplo de un objeto.- El resultado de
typeof nulles"object". Esto está oficialmente reconocido como un error de comportamiento detypeofque proviene de los primeros dÃas de JavaScript y se mantiene por compatibilidad. Definitivamentenullno es un objeto. Es un valor especial con un tipo propio separado. - El resultado de
typeof alertes"function"porquealertes una función. Estudiaremos las funciones en los próximos capÃtulos donde veremos que no hay ningún tipo especial âfunctionâ en JavaScript. Las funciones pertenecen al tipo objeto. Perotypeoflas trata de manera diferente, devolviendofunction. Además proviene de los primeros dÃas de JavaScript. Técnicamente dicho comportamiento es incorrecto, pero puede ser conveniente en la práctica.
typeof(x)Se puede encontrar otra sintaxis en algún código: typeof(x). Es lo mismo que typeof x.
Para ponerlo en claro: typeof es un operador, no una función. Los paréntesis aquà no son parte del operador typeof. Son del tipo usado en agrupamiento matemático.
Usualmente, tales paréntesis contienen expresiones matemáticas tales como (2 + 2), pero aquà solo tienen un argumento (x). Sintácticamente, permiten evitar el espacio entre el operador typeof y su argumento, y a algunas personas les gusta asÃ.
Algunos prefieren typeof(x), aunque la sintaxis typeof x es mucho más común.
Resumen
Hay 8 tipos básicos en JavaScript.
- Siete tipos de datos primitivos
numberpara números de cualquier tipo: enteros o de punto flotante, los enteros están limitados por±(253-1).bigintpara números enteros de longitud arbitraria.stringpara cadenas. Una cadena puede tener cero o más caracteres, no hay un tipo especial para un único carácter.booleanpara verdadero y falso:true/false.nullpara valores desconocidos â un tipo independiente que tiene un solo valor nulo:null.undefinedpara valores no asignados â un tipo independiente que tiene un único valor âindefinidoâ:undefined.symbolpara identificadores únicos.
- Y un tipo de dato no primitivo:
objectpara estructuras de datos complejas.
El operador typeof nos permite ver qué tipo está almacenado en una variable.
- Dos formas:
typeof xotypeof(x). - Devuelve una cadena con el nombre del tipo. Por ejemplo
"string". - Para
nulldevuelve"object": esto es un error en el lenguaje, en realidad no es un objeto.
Comentarios
<code>, para varias lÃneas â envolverlas en la etiqueta<pre>, para más de 10 lÃneas â utilice una entorno controlado (sandbox) (plnkr, jsbin, codepenâ¦)