Movatterモバイル変換


[0]ホーム

URL:


  1. Tecnología web para desarrolladores
  2. JavaScript
  3. Guía de JavaScript
  4. Tipos de datos y estructuras en JavaScript

Esta página ha sido traducida del inglés por la comunidad.Aprende más y únete a la comunidad de MDN Web Docs.

View in EnglishAlways switch to English

Tipos de datos y estructuras en JavaScript

Todos los lenguajes de programación tienen estructuras de datos integradas, pero estas a menudo difieren de un lenguaje a otro. Este artículo 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.

Tipado dinámico

JavaScript es un lenguajedébilmente tipado ydinámico. Las variables en JavaScript no están asociadas directamente con ningún 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 númerofoo = "bar"; // foo ahora es un stringfoo = true; // foo ahora es un booleano

Estructuras y tipos de datos

El último estándar ECMAScript define nueve tipos:

  • Seistipos de datosprimitivos, controlados por eloperador 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". Tipoprimitivo especial que tiene un uso adicional para su valor: si el objeto no se hereda, se muestranull;

  • Object:typeof instance === "object". Tipo estructural especial que no es de datos pero para cualquier instancia de objetoconstruido que también se utiliza como estructuras de datos: newObject, newArray, newMap, newSet, newWeakMap, newWeakSet, newDate y casi todo lo hecho con lapalabra clavenew;

  • Function: una estructura sin datos, aunque también responde al operadortypeof:typeof instance === "function". Esta simplemente es una forma abreviada para funciones, aunque cada constructor de funciones se deriva del constructorObject.

Ten en cuenta que el único propósito valioso del uso del operadortypeof es verificar el tipo de dato. Si deseamos verificar cualquier Tipo Estructural derivado deObject, no tiene sentido usartypeof para eso, ya que siempre recibiremos "object". La forma correcta de comprobar qué tipo de Objeto estamos usando es la palabra claveinstanceof. Pero incluso en ese caso, puede haber conceptos erróneos.

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".

TipoBoolean

Boolean representa una entidad lógica y puede tener dos valores:true yfalse. ConsultaBoolean yBoolean para obtener más detalles.

TipoNull

El tipoNull tiene exactamente un valor:null. Consultanull yNull para obtener más detalles.

TipoUndefined

Una variable a la que no se le ha asignado un valor tiene el valorundefined. Consultaundefined yUndefined para obtener más detalles.

TipoNumber

ECMAScript tiene dos tipos numéricos integrados:Number yBigInt (ve más abajo).

El tipoNumber es unvalor en formato binario de 64 bits de doble precisión IEEE 754 (números entre -(253 - 1) y 253 - 1). Además de representar números de punto flotante, el tipoNumber tiene tres valores simbólicos:+Infinity,-Infinity yNaN ("Not aNumber" o No es un número).

Para verificar el valor disponible más grande o el valor más pequeño disponible dentro de±Infinity, puedes usar las constantesNumber.MAX_VALUE oNumber.MIN_VALUE.

Nota:A partir de ECMAScript 2015, también puedes comprobar si un número está en el rango de números de punto flotante de doble precisión medianteNumber.isSafeInteger() así comoNumber.MAX_SAFE_INTEGER yNumber.MIN_SAFE_INTEGER.Más allá de este rango, los enteros en JavaScript ya no son seguros y serán una aproximación de punto flotante de doble precisión del valor.

El tiponumber 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 estrue. Sin embargo, puedes notar esto cuando divides entre cero:

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

Aunque unnumber a menudo representa solo su valor, JavaScript proporcionaoperadores binarios (bitwise).

Nota:Aunque los operadores bit a bit sepueden usar para representar múltiples valores Booleanos dentro de un solo número usando elenmascaramiento de bits, esto generalmente se considera una mala práctica. 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 también tiende a hacer que el código sea más difícil de leer, comprender y mantener.

Posiblemente sea necesario utilizar estas técnicas 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 técnica solo se debe considerar cuando sea la última medida que se pueda tomar para optimizar el tamaño.

TipoBigInt

El tipoBigInt es un primitivo numérico en JavaScript que puede representar números enteros con precisión arbitraria. ConBigInts, puedes almacenar y operar de forma segura en números enteros grandes incluso más allá del límite seguro de enteros paraNumbers.

UnBigInt se crea agregandon al final de un número entero o llamando al constructor.

Puedes obtener el valor más seguro que se puede incrementar conNumbers utilizando la constanteNumber.MAX_SAFE_INTEGER. Con la introducción deBigInts, puedes operar con números más allá deNumber.MAX_SAFE_INTEGER.

Este ejemplo demuestra, dónde, incrementando elNumber.MAX_SAFE_INTEGER devuelve el resultado esperado:

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

Puedes utilizar los operadores+,*,-,** y% conBigInts, igual que conNumbers. UnBigInt no es estrictamente igual a unNumber, pero lo es en términos generales.

UnBigInt se comporta como unNumber en los casos en que se convierte aBoolean:if,||,&&,Boolean,!.

LosBigInt no se pueden utilizar indistintamente con losNumber. En su lugar, se lanzará unTypeError.

TipoString

El tipoString de JavaScript se utiliza para representar datos textuales. Es un conjunto de "elementos" de valores enteros sin signo de 16 bits. Cada elemento delString ocupa una posición en la cadena. El primer elemento está en el índice0, el siguiente en el índice1, y así sucesivamente. La longitud de una cadena es el número de elementos que contiene.

A diferencia de algunos lenguajes de programación (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, todavía es posible crear otra cadena basada en una operación en la cadena original. Por ejemplo:

  • Una subcadena de la original seleccionando letras individuales o usandoString.substr().
  • Una concatenación de dos cadenas usando el operador de concatenación (+) oString.concat().

¡Ten cuidado de no "convertir a cadenas" tu código!

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

  • Es fácil construir cadenas complejas con concatenación.
  • Las cadenas son fáciles de depurar (lo que ves impreso siempre es lo que está en la cadena).
  • Las cadenas son el denominador común de muchas APIs (campos de entrada —inputs—,valores de almacenamiento local, respuestasXMLHttpRequest cuando se usaresponseText, 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 podría emular una lista (mientras que un arreglo de JavaScript sería más 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 abstracción adecuada.

TipoSymbol

Un símbolo es un valor primitivoúnico einmutable y se puede utilizar como clave de una propiedad de objeto (ve más abajo). En algunos lenguajes de programación, los símbolos se denominan "átomos".

Para obtener más detalles, consultaSymbol y el contenedor de objetosSymbol en JavaScript.

Objetos

En ciencias de la computación, un objeto es un valor en la memoria al que posiblemente hace referencia unidentificador.

Propiedades

En JavaScript, los objetos se pueden ver como una colección de propiedades. Con lasintaxis 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 valoresclave. Un valorclave es un valor de cadena o un símbolo.

Hay dos tipos de propiedades de objeto que tienen ciertos atributos: la propiedaddata y la propiedadaccessor.

Nota:Cada propiedad tieneatributos 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.ConsultaObject.defineProperty() para obtener más información.

PropiedadData

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

Atributos de una propiedaddata

AtributoTipoDescripciónValor predeterminado
[[Value]]Cualquier tipo de JavaScriptEl valor recuperado por un captador de accesoget a la propiedad.undefined
[[Writable]]BooleanSi esfalse, el [[Value]] de la propiedad no se puede cambiar.false
[[Enumerable]]BooleanSi estrue, la propiedad se enumerará en buclesfor...in. Consulta tambiénEnumerabilidad y posesión de propiedades.false
[[Configurable]]BooleanSi esfalse, 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).

AtributoTipoDescripción
Read-onlyBooleanEstado inverso del atributo ES5 [[Writable]].
DontEnumBooleanEstado inverso del atributo ES5 [[Enumerable]].
DontDeleteBooleanEstado inverso del atributo ES5 [[Configurable]].

PropiedadAccessor

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

AtributoTipoDescripciónValor predeterminado
[[Get]]ObjetoFunction oundefinedLa función se llama con una lista de argumentos vacía y recupera el valor de la propiedad cada vez que se realiza un acceso al valor. Consulta tambiénget.undefined
[[Set]]ObjetoFunction oundefinedLa función se llama con un argumento que contiene el valor asignado y se ejecuta siempre que se intenta cambiar una propiedad específica. Consulta tambiénset.undefined
[[Enumerable]]BooleanSi estrue, la propiedad se enumerará en buclesfor...in.false
[[Configurable]]BooleanSi esfalse, 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 asociación entreclaves yvalores. Las claves son cadenas (oSymbols), y losvalores pueden ser cualquier cosa. Esto hace que los objetos se ajusten naturalmente ahashmaps.

Las funciones son objetos regulares con la capacidad adicional de serinvocables.

Fechas

Al representar fechas, la mejor opción es utilizar la utilidadDate incorporada en JavaScript.

Colecciones indexadas: arreglos y arreglos tipados

Los arreglos son objetos regulares para los que existe una relación particular entre las propiedades de clave entera y la Propiedadlength.

Además, los arreglos heredan deArray.prototype, que les proporciona un puñado de convenientes métodos para manipular arreglos. Por ejemplo,indexOf (buscando un valor en el arreglo) opush (agrega un elemento al arreglo), y así sucesivamente. Esto hace que elArray sea un candidato perfecto para representar listas o conjuntos.

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

TipoIntervalo de valoresTamaño en bytesDescripciónTipo de IDL webTipo C equivalente
Int8Array-128 a1271Dos enteros complementarios de 8 bits con signobyteint8_t
Uint8Array0 a2551Entero de 8-bit sin signooctetuint8_t
Uint8ClampedArray0 a2551Entero de 8 bits sin signo (sujeto)octetuint8_t
Int16Array-32768 a327672Dos enteros complementarios de 16 bits con signoshortint16_t
Uint16Array0 a655352Entero de 16 bits sin signoShort sin signouint16_t
Int32Array-2147483648 a21474836474dos enteros complementarios de 32 bits con signolongint32_t
Uint32Array0 a42949672954Enteros de 32 bits sin signolong sin signouint32_t
Float32Array1.2×10-38 a3.4×10384Número de coma flotante IEEE de 32 bits (7 dígitos significativos, p. ej.,1.1234567)float sin restriccionesfloat
Float64Array5.0×10-324 a1.8×103088Número de coma flotante IEEE de 64 bits (16 dígitos significativos, p. ej.,1.123...15)doble sin restriccionesdouble
BigInt64Array-263 a263-18Dos enteros complementarios de 64 bits con signobigintint64_t (long long con signo)
BigUint64Array0 a264-18Entero de 64 bits sin signobigintuint64_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 yWeakSet representan un conjunto de objetos, mientras queMap yWeakMap se asocian un valor a un objeto.

La diferencia entreMaps yWeakMaps es que en el primero, las claves de objeto se pueden enumerar. Esto permite la optimización de la recolección de basura en el último caso.

Se podrían implementarMaps ySets 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 búsqueda sería necesariamente lineal. Las implementaciones nativas de ellos (incluidos losWeakMaps) pueden tener un rendimiento de búsqueda que es aproximadamente logarítmico al tiempo constante.

Por lo general, para vincular datos a un nodo DOM, se pueden establecer propiedades directamente en el objeto o usar atributosdata-*. Esto tiene la desventaja de que los datos están disponibles para cualquier script que se ejecute en el mismo contexto. LosMaps yWeakMaps facilitan la vinculaciónprivada de datos a un objeto.

Datos estructurados: JSON

JSON (JavaScriptObjectNotation) es un formato ligero de intercambio de datos, derivado de JavaScript, pero utilizado por muchos lenguajes de programación. JSON crea estructuras de datos universales.

ConsultaJSON yJSON para obtener más detalles.

Más objetos en la biblioteca estándar

JavaScript tiene una biblioteca estándar de objetos integrados.

Échale un vistazo a lareferencia para conocer más objetos.

Determinación de tipos usando el operadortypeof

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

Lee lapágina de referencia para obtener más detalles y casos extremos.

Ve también

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp