[ Web Proxy ]
URL:
Viewing: https://developer.mozilla.org/es/docs/Web/JavaScript/Guide/Data_structures#boolean_type [Back]  [Original]

Tipos de datos y estructuras en JavaScript - JavaScript | MDN

Esta pgina ha sido traducida del ingls por la comunidad. Aprende ms y nete a la comunidad de MDN Web Docs.

View in English Always switch to English

Tipos de datos y estructuras en JavaScript

Todos los lenguajes de programacin tienen estructuras de datos integradas, pero estas a menudo difieren de un lenguaje a otro. Este artculo intenta enumerar las estructuras de datos integradas disponibles en JavaScript y las propiedades que tienen. Estas se pueden utilizar para construir otras estructuras de datos. Siempre que es posible, se hacen comparaciones con otros lenguajes.

In this article

Tipado dinmico

JavaScript es un lenguaje dbilmente tipado y dinmico. Las variables en JavaScript no estn asociadas directamente con ningn tipo de valor en particular, y a cualquier variable se le puede asignar (y reasignar) valores de todos los tipos:

js
let foo = 42; // foo ahora es un nmero
foo = "bar"; // foo ahora es un string
foo = true; // foo ahora es un booleano

Estructuras y tipos de datos

El ltimo estndar ECMAScript define nueve tipos:

  • Seis tipos de datos primitivos, controlados por el operador typeof

    • Undefined: typeof instance === "undefined"
    • Boolean: typeof instance === "boolean"
    • Number: typeof instance === "number"
    • String: typeof instance === "string"
    • BigInt: typeof instance === "bigint"
    • Symbol: typeof instance === "symbol"
  • Null: typeof instance === "object". Tipo primitivo especial que tiene un uso adicional para su valor: si el objeto no se hereda, se muestra null;

  • Object: typeof instance === "object". Tipo estructural especial que no es de datos pero para cualquier instancia de objeto construido que tambin se utiliza como estructuras de datos: new Object, new Array, new Map, new Set, new WeakMap, new WeakSet, new Date y casi todo lo hecho con la palabra clave new;

  • Function: una estructura sin datos, aunque tambin responde al operador typeof: typeof instance === "function". Esta simplemente es una forma abreviada para funciones, aunque cada constructor de funciones se deriva del constructor Object.

Ten en cuenta que el nico propsito valioso del uso del operador typeof es verificar el tipo de dato. Si deseamos verificar cualquier Tipo Estructural derivado de Object, no tiene sentido usar typeof para eso, ya que siempre recibiremos "object". La forma correcta de comprobar qu tipo de Objeto estamos usando es la palabra clave instanceof. Pero incluso en ese caso, puede haber conceptos errneos.

Valores primitivos

Todos los tipos, excepto los objetos, definen valores inmutables (es decir, valores que no se pueden cambiar). Por ejemplo (y a diferencia de C), las cadenas son inmutables. Nos referimos a los valores de estos tipos como "valores primitivos".

Tipo Boolean

Boolean representa una entidad lgica y puede tener dos valores: true y false. Consulta Boolean y Boolean para obtener ms detalles.

Tipo Null

El tipo Null tiene exactamente un valor: null. Consulta null y Null para obtener ms detalles.

Tipo Undefined

Una variable a la que no se le ha asignado un valor tiene el valor undefined. Consulta undefined y Undefined para obtener ms detalles.

Tipo Number

ECMAScript tiene dos tipos numricos integrados: Number y BigInt (ve ms abajo).

El tipo Number es un valor en formato binario de 64 bits de doble precisin IEEE 754 (nmeros entre -(253 - 1) y 253 - 1). Adems de representar nmeros de punto flotante, el tipo Number tiene tres valores simblicos: +Infinity, -Infinity y NaN ("Not a Number" o No es un nmero).

Para verificar el valor disponible ms grande o el valor ms pequeo disponible dentro de Infinity, puedes usar las constantes Number.MAX_VALUE o Number.MIN_VALUE.

Nota: A partir de ECMAScript 2015, tambin puedes comprobar si un nmero est en el rango de nmeros de punto flotante de doble precisin mediante Number.isSafeInteger() as como Number.MAX_SAFE_INTEGER y Number.MIN_SAFE_INTEGER.Ms all de este rango, los enteros en JavaScript ya no son seguros y sern una aproximacin de punto flotante de doble precisin del valor.

El tipo number solo tiene un entero con dos representaciones: 0 se representa como -0 y +0. (0 es un alias de +0).

En la praxis, esto casi no tiene impacto. Por ejemplo, +0 === -0 es true. Sin embargo, puedes notar esto cuando divides entre cero:

js
> 42 / +0
Infinity
> 42 / -0
-Infinity

Aunque un number a menudo representa solo su valor, JavaScript proporciona operadores binarios (bitwise).

Nota: Aunque los operadores bit a bit se pueden usar para representar mltiples valores Booleanos dentro de un solo nmero usando el enmascaramiento de bits, esto generalmente se considera una mala prctica. JavaScript ofrece otros medios para representar un conjunto de valores booleanos (como un arreglo de valores booleanos o un objeto con valores booleanos asignados a propiedades con nombre). El enmascaramiento de bits tambin tiende a hacer que el cdigo sea ms difcil de leer, comprender y mantener.

Posiblemente sea necesario utilizar estas tcnicas en entornos muy restringidos, como cuando se intenta hacer frente a las limitaciones del almacenamiento local, o en casos extremos (como cuando cada bit de la red cuenta). Esta tcnica solo se debe considerar cuando sea la ltima medida que se pueda tomar para optimizar el tamao.

Tipo BigInt

El tipo BigInt es un primitivo numrico en JavaScript que puede representar nmeros enteros con precisin arbitraria. Con BigInts, puedes almacenar y operar de forma segura en nmeros enteros grandes incluso ms all del lmite seguro de enteros para Numbers.

Un BigInt se crea agregando n al final de un nmero entero o llamando al constructor.

Puedes obtener el valor ms seguro que se puede incrementar con Numbers utilizando la constante Number.MAX_SAFE_INTEGER. Con la introduccin de BigInts, puedes operar con nmeros ms all de Number.MAX_SAFE_INTEGER.

Este ejemplo demuestra, dnde, incrementando el Number.MAX_SAFE_INTEGER devuelve el resultado esperado:

js
> const x = 2n ** 53n;
9007199254740992n
> const y = x + 1n;
9007199254740993n

Puedes utilizar los operadores +, *, -, ** y % con BigInts, igual que con Numbers. Un BigInt no es estrictamente igual a un Number, pero lo es en trminos generales.

Un BigInt se comporta como un Number en los casos en que se convierte a Boolean: if, ||, &&, Boolean, !.

Los BigInt no se pueden utilizar indistintamente con los Number. En su lugar, se lanzar un TypeError.

Tipo String

El tipo String de JavaScript se utiliza para representar datos textuales. Es un conjunto de "elementos" de valores enteros sin signo de 16 bits. Cada elemento del String ocupa una posicin en la cadena. El primer elemento est en el ndice 0, el siguiente en el ndice 1, y as sucesivamente. La longitud de una cadena es el nmero de elementos que contiene.

A diferencia de algunos lenguajes de programacin (tal como C), las cadenas de JavaScript son inmutables. Esto significa que una vez que se crea una cadena, no es posible modificarla.

Sin embargo, todava es posible crear otra cadena basada en una operacin en la cadena original. Por ejemplo:

  • Una subcadena de la original seleccionando letras individuales o usando String.substr().
  • Una concatenacin de dos cadenas usando el operador de concatenacin (+) o String.concat().

Ten cuidado de no "convertir a cadenas" tu cdigo!

Puede resultar tentador utilizar cadenas para representar datos complejos. Hacer esto viene con beneficios a corto plazo:

  • Es fcil construir cadenas complejas con concatenacin.
  • Las cadenas son fciles de depurar (lo que ves impreso siempre es lo que est en la cadena).
  • Las cadenas son el denominador comn de muchas APIs (campos de entrada inputs, valores de almacenamiento local, respuestas XMLHttpRequest cuando se usa responseText, etc.) y puede resultar tentador trabajar solo con cadenas.

Con las convenciones, es posible representar cualquier estructura de datos en una cadena. Esto no la convierte en una buena idea. Por ejemplo, con un separador, se podra emular una lista (mientras que un arreglo de JavaScript sera ms adecuado). Desafortunadamente, cuando el separador se usa en uno de los elementos de la "lista", la lista se rompe. Se puede elegir un caracter de escape, etc. Todo esto requiere convenciones y crea una innecesaria carga de mantenimiento.

Utiliza cadenas para datos textuales. Cuando quieras representar datos complejos, procesa las cadenas y usa la abstraccin adecuada.

Tipo Symbol

Un smbolo es un valor primitivo nico e inmutable y se puede utilizar como clave de una propiedad de objeto (ve ms abajo). En algunos lenguajes de programacin, los smbolos se denominan "tomos".

Para obtener ms detalles, consulta Symbol y el contenedor de objetos Symbol en JavaScript.

Objetos

En ciencias de la computacin, un objeto es un valor en la memoria al que posiblemente hace referencia un identificador.

Propiedades

En JavaScript, los objetos se pueden ver como una coleccin de propiedades. Con la sintaxis de objeto literal, se inicia un conjunto limitado de propiedades; luego se pueden agregar y eliminar propiedades. Los valores de propiedad pueden ser valores de cualquier tipo, incluidos otros objetos, lo que permite construir estructuras de datos complejas. Las propiedades se identifican mediante valores clave. Un valor clave es un valor de cadena o un smbolo.

Hay dos tipos de propiedades de objeto que tienen ciertos atributos: la propiedad data y la propiedad accessor.

Nota: Cada propiedad tiene atributos correspondientes. Los atributos, internamente los utiliza el motor JavaScript, por lo que no puedes acceder a ellos directamente. Es por eso que los atributos se enumeran entre corchetes dobles, en lugar de simples.Consulta Object.defineProperty() para obtener ms informacin.

Propiedad Data

Asocia una clave con un valor y tiene los siguientes atributos:

Atributos de una propiedad data

Atributo Tipo Descripcin Valor predeterminado
[[Value]] Cualquier tipo de JavaScript El valor recuperado por un captador de acceso get a la propiedad. undefined
[[Writable]] Boolean Si es false, el [[Value]] de la propiedad no se puede cambiar. false
[[Enumerable]] Boolean Si es true, la propiedad se enumerar en bucles for...in. Consulta tambin Enumerabilidad y posesin de propiedades. false
[[Configurable]] Boolean Si es false, la propiedad no se puede eliminar, no se puede cambiar a una propiedad de acceso descriptor y los atributos que no sean [[Value]] y [[Writable]] no se pueden cambiar. false

Atributos obsoletos (a partir de ECMAScript 3, renombrado en ECMAScript 5).

Atributo Tipo Descripcin
Read-only Boolean Estado inverso del atributo ES5 [[Writable]].
DontEnum Boolean Estado inverso del atributo ES5 [[Enumerable]].
DontDelete Boolean Estado inverso del atributo ES5 [[Configurable]].

Propiedad Accessor

Asocia una clave con una de las dos funciones de acceso (get y set) para recuperar o almacenar un valor y tiene los siguientes atributos:

Atributo Tipo Descripcin Valor predeterminado
[[Get]] Objeto Function o undefined La funcin se llama con una lista de argumentos vaca y recupera el valor de la propiedad cada vez que se realiza un acceso al valor. Consulta tambin get. undefined
[[Set]] Objeto Function o undefined La funcin se llama con un argumento que contiene el valor asignado y se ejecuta siempre que se intenta cambiar una propiedad especfica. Consulta tambin set. undefined
[[Enumerable]] Boolean Si es true, la propiedad se enumerar en bucles for...in. false
[[Configurable]] Boolean Si es false, la propiedad no se puede eliminar y no se puede cambiar a una propiedad de datos. false

Objetos y funciones "normales"

Un objeto JavaScript es una asociacin entre claves y valores. Las claves son cadenas (o Symbols), y los valores pueden ser cualquier cosa. Esto hace que los objetos se ajusten naturalmente a hashmaps.

Las funciones son objetos regulares con la capacidad adicional de ser invocables.

Fechas

Al representar fechas, la mejor opcin es utilizar la utilidad Date incorporada en JavaScript.

Colecciones indexadas: arreglos y arreglos tipados

Los arreglos son objetos regulares para los que existe una relacin particular entre las propiedades de clave entera y la Propiedad length.

Adems, los arreglos heredan de Array.prototype, que les proporciona un puado de convenientes mtodos para manipular arreglos. Por ejemplo, indexOf (buscando un valor en el arreglo) o push (agrega un elemento al arreglo), y as sucesivamente. Esto hace que el Array sea un candidato perfecto para representar listas o conjuntos.

Los Arreglos tipados son nuevos en JavaScript con ECMAScript 2015 y presentan una vista similar a un arreglo de un bfer de datos binarios subyacente. La siguiente tabla ayuda a determinar los tipos de datos equivalentes en C:

Tipo Intervalo de valores Tamao en bytes Descripcin Tipo de IDL web Tipo C equivalente
Int8Array -128 a 127 1 Dos enteros complementarios de 8 bits con signo byte int8_t
Uint8Array 0 a 255 1 Entero de 8-bit sin signo octet uint8_t
Uint8ClampedArray 0 a 255 1 Entero de 8 bits sin signo (sujeto) octet uint8_t
Int16Array -32768 a 32767 2 Dos enteros complementarios de 16 bits con signo short int16_t
Uint16Array 0 a 65535 2 Entero de 16 bits sin signo Short sin signo uint16_t
Int32Array -2147483648 a 2147483647 4 dos enteros complementarios de 32 bits con signo long int32_t
Uint32Array 0 a 4294967295 4 Enteros de 32 bits sin signo long sin signo uint32_t
Float32Array 1.210-38 a 3.41038 4 Nmero de coma flotante IEEE de 32 bits (7 dgitos significativos, p. ej., 1.1234567) float sin restricciones float
Float64Array 5.010-324 a 1.810308 8 Nmero de coma flotante IEEE de 64 bits (16 dgitos significativos, p. ej., 1.123...15) doble sin restricciones double
BigInt64Array -263 a 263-1 8 Dos enteros complementarios de 64 bits con signo bigint int64_t (long long con signo)
BigUint64Array 0 a 264-1 8 Entero de 64 bits sin signo bigint uint64_t (long long sin signo)

Colecciones con clave: mapas, conjuntos, WeakMaps, WeakSets

Estas estructuras de datos, introducidas en ECMAScript Edition 6, toman referencias a objetos como claves. Set y WeakSet representan un conjunto de objetos, mientras que Map y WeakMap se asocian un valor a un objeto.

La diferencia entre Maps y WeakMaps es que en el primero, las claves de objeto se pueden enumerar. Esto permite la optimizacin de la recoleccin de basura en el ltimo caso.

Se podran implementar Maps y Sets en ECMAScript 5 puro. Sin embargo, dado que los objetos no se pueden comparar (en el sentido de < "menor que", por ejemplo), el rendimiento de bsqueda sera necesariamente lineal. Las implementaciones nativas de ellos (incluidos los WeakMaps) pueden tener un rendimiento de bsqueda que es aproximadamente logartmico al tiempo constante.

Por lo general, para vincular datos a un nodo DOM, se pueden establecer propiedades directamente en el objeto o usar atributos data-*. Esto tiene la desventaja de que los datos estn disponibles para cualquier script que se ejecute en el mismo contexto. Los Maps y WeakMaps facilitan la vinculacin privada de datos a un objeto.

Datos estructurados: JSON

JSON (Java Script Object Notation) es un formato ligero de intercambio de datos, derivado de JavaScript, pero utilizado por muchos lenguajes de programacin. JSON crea estructuras de datos universales.

Consulta JSON y JSON para obtener ms detalles.

Ms objetos en la biblioteca estndar

JavaScript tiene una biblioteca estndar de objetos integrados.

chale un vistazo a la referencia para conocer ms objetos.

Determinacin de tipos usando el operador typeof

El operador typeof te puede ayudar a encontrar el tipo de tu variable.

Lee la pgina de referencia para obtener ms detalles y casos extremos.

Ve tambin


Web Proxy Viewer  |  New URL  |  Original Page