JavaScript — Tipo de Valores

Mauricio Garcia
8 min readNov 7, 2019

--

Antes de iniciar quiero agradecer a mi compañero Jero, por ayudarme a que este post haya quedado más completo.

Temario

  • Types (valores primitivos y complejos)
  • Operador typeof
  • Valores primitivos (boolean, null, undefined, number, string, symbol)
  • Valores complejos (object, function, array, date , promise)
  • Casos especiales (null, NaN)
  • Conceptos: Mutabilidad e Inmutabilidad

i. Types

JavaScript es un lenguaje de tipado dinámico y de tipado débil

Con tipado dinámico nos referimos a que no es necesario declarar el tipo de dato al que se va a referir, el tipo de dato se definirá automáticamente cuando comiencen a correr los procesos del programa.

En JavaScript naturalmente no es fuertemente tipado, pero… podemos hacerlo usando algún superset como TypeScript .

Ejemplo en TypeScript:

En este caso no vamos a tocar este tema, ya que no es el objetivo, pero es bueno que lo sepas…

Mencionamos que JavaScript también es de tipado débil, esto quiere decir va a intentar aplicar coerción en los datos (En Ecuaciones Complejas[ref] veremos el tema de coerción de datos a detalle)

Ejemplo:

ii. Operador typeof

Antes de ver los tipos de datos, expliquemos rápidamente el operador typeof…

El operador typeof devuelve una cadena que indica el tipo del operando sin evaluarlo (operando es la cadena, variable, palabra clave u objeto para el que se devolverá su tipo)[ref].

Cuando queramos saber el tipo de operando de algún valor vamos a utilizar el operador typeof.

Ejemplo:

En la versión de JavaScript (ES6) existen varios tipos de valores los cuales se dividen en valores primitivos y valores objeto (valores complejos).

iii. Valores primitivos

Los valores primitivos son aquellos que definen valores inmutables, es decir, que no pueden ser cambiados. Los valores primitivos son los siguientes:

  • boolean — true o false.
  • null — sin valor.
  • undefined : una variable declarada pero no se le ha dado un valor.
  • number — enteros, flotantes, etc.
  • string — una matriz de caracteres, es decir, palabras.
  • symbol : un valor único que no es igual a ningún otro valor.

Una manera fácil de identificar los primitivos:

  • No tienen métodos propios.
  • TODOS los primitivos son inmutables

Ejemplos:

a — boolean

Este tipo de dato representa a una lógica y la cual solo puede almacenar un bit el cual indica uno de dos valores, true o false.

b — null

El tipo de valor null representa a un valor nulo, inválido o inexistente.

c — undefined

Este tipo de dato representa a una variable a la que no se le ha definido ningún valor por lo que tiene el valor undefined.

d — number

El tipo de valor number nos sirve para almacenar valores numéricos los cuales los usamos principalmente para contar, hacer cálculos y comparaciones.

Cuenta con tres valores simbólicos los cuales son:

  1. NaN (Not a number)
  2. Number.MAX_VALUE (aprox. 1.79E+308)
  3. Number.MIN_VALUE (aprox. 5e-324).

e — string

Las variables de tipo de dato string almacenan cadenas de caracteres, letras o palabras y estas se definen entre comillas simples.

Cada elemento dentro de la cadena es parte de un conjunto y cada uno de los elemento del conjunto cuenta con una posición.

Ejemplo :

El primer elemento de una cadena de caracteres tiene el índice 0, el segundo tiene el índice 1 y así sucesivamente. La longitud de una cadena es el número de elementos que contiene.

f — symbol

Este tipo de valor es nuevo en JavaScript (ES6) y son utilizados como claves en objetos sin que puedan ser convertidos a otros tipos.

iv. Valores complejos

Complejos podemos considerar 3 como principales:

  • object
  • array
  • function

Aunque hay otros como:

  • Boolean
  • Symbol
  • Error
  • Number
  • String
  • RegExp
  • Math
  • Set

NOTA: Pareciera que algunos de los que mencionamos están el la lista primitiva, pero NO es así, los mencionados en esta lista actúan como constructores para crear primitivos.

Cuando se accede a un tipo complejo, se trabaja por referencia el valor (más adelante veremos a qué nos referimos con “referencia”).

a — object

Los objetos (Object) se pueden determinar como una lista estructurada de pares de claves y valores en donde se pueden agregar datos, cada una de las claves puede ser una cadena de caracteres o Symbol y el valor puede ser cualquier tipo de dato. A continuación mencionaremos algunos de los tipos de datos objetos más usados.

b — function

Las funciones (function) se pueden considerar objetos regulares con la peculiaridad de poder ser llamadas posteriormente y estas se pueden guardar en variables (más adelante veremos las funciones muy a fondo [ref])

c — Array

Los arreglos (Array) son objetos regulares los cuales se pueden considerar como una colección de datos los cuales pueden ser de tipo Number, String, Object, etc. Se pueden crear con la expresión literal [ ] o con el constructor new Array();

d — Date

Para tener un objeto de tipo fecha (Date), con el constructor new Date() se crea un objeto Date con la fecha y la hora de ese instante.

e — Promise

Una promesa (Promise) es un objeto que representa el éxito o fracaso de una operación asíncrona y esta nos sirve para reservar el resultado de una operación futura (más adelante lo veremos a JavaScript — Callbacks y Promises[ref]).

v. Casos especiales

a — null

Es un caso bastante wtf!, pero como todo en JS tiene su explicación…

La documentación nos dice que null es un dato de tipo primitivo, pero si nosotros ponemos en consola el siguiente código:

console.log(typeof null); //output object

Podemos observar que nos imprime object, pero… entonces… bueno la explicación es bastante sencilla:

Este es un error al momento que se codificó JS y que no se piensa corregir ya que destroza todo el Internet, bueno no tan así, pero sí afectaría a todas las páginas que usen JS, y este error ha existido desde la primera versión de JS, y el error se debe a la forma en que se valida el tipo de dato, veamos un pseudocódigo [aquí el código fuente]:

Podemos observar que nunca tomaron en cuenta el null.

b — NaN

Es un caso bastante wtf!, bueno.. realmente no, mas bien siempre hemos tenido el concepto equivocado, veamos…

Si la documentación dice que NaN no es un número, entonces por que cuando usamos el operador typeof nos dice que es un número

Hablando técnicamente NaN es un tipo de dato numérico pero cuyo valor no puede ser representado con números reales, entonces el “no numérico” realmente significa que no puede representarse con números.

Lo malo es que NaN no es igual a nada, de hecho ni a el mismo…

Eso es correcto ya que son dos representaciones diferentes…

vi. Inmutabilidad y mutabilidad

En el tema de Tipo de Valores, vimos que hay dos tipos de asignación a una variable:

  1. Por valor (primitivos) — inmutabilidad
  2. Por referencia (objetos) — mutabilidad

a — Por valor

Creamos una variable a y le asignamos el valor de 100:

En la imagen estamos simulando cuando JavaScript guarda en memoria la variable (de ahora en adelante le llamaremos “caja”); ahora creamos una variable b y le asignamos el valor de a

Imprimimos en consola el valor de a y b, podemos ver que cada uno tiene asignado una caja

Ahora, a la variable b le cambiamos el valor a 300

Imprimimos en consola el valor de a y b, podemos ver que cada uno tiene asignado una una caja manteniendo cada uno su propio valor.

b — Por referencia

Creamos una variable a y le asignamos el objeto {name: ‘Mauricio’}

Ahora creamos una variable b y le asignamos el valor de a

Podemos observar en la imagen, en vez de que la variable b genere su propia caja, lo que hace es apuntar a la misma caja que tiene a (lo que está haciendo es una conexión o referencia al objeto de a), si nosotros imprimimos en consola a y b, se vería algo así:

Y a partir de aquí es donde comienza a ocurrir todo el desastre, veamos por qué, supongamos que necesitamos cambiar el valor de b.name

Imprimimos en consola el valor a y b, ¿Qué crees que ocurrirá?, ¿Cada uno mantendrá su propio valor?, ¿Ambos cambian al mismo?

Efectivamente al estar haciendo referencia al mismo objeto ambas variables son afectadas.

Resumiendo: Cuando asignamos valores a los primitivos, el valor asignado realmente es una copia del valor asignado; y cuando asignamos valores a los complejos, realmente es una referencia al valor original.

Ahora ya eres capaz de entender la mayoría de los tipos de datos que tiene JavaScript, así como los conceptos de mutabilidad e inmutabilidad

En la siguiente entrega vamos a ver JavaScript — Funciones.

La entrega pasada vimos POO —Programación basada en prototipos

--

--

Responses (1)