Análisis de tipos de datos de JavaScript
Recientemente, estaba revisando los conceptos básicos de JS y descubrí que mi comprensión de BigInt y Number no es muy profunda, y mi comprensión de NaN no está en su lugar, por lo que planeo escribir un artículo para explicarlo en detalle.
Artículo de referencia :
- Explicación detallada de los tipos de datos en Javascript - Nuggets (juejin.cn)
- Tipos de datos básicos de JavaScript - Nuggets (juejin.cn)
- Tipos de datos de JavaScript | Tutorial para principiantes (runoob.com)
- Introducción a ECMAScript 6 (ruanyifeng.com)
- Comprender los constructores y los objetos prototipo - Nuggets (juejin.cn)
⭐ Sugerencias : después de estudiar este artículo, tendrá una comprensión amplia de los ocho tipos de datos de JavaScript, adecuados para que los principiantes vean o revisen, no adecuados para una comprensión profunda.
- Hay dos tipos de datos en JS
- Tipos de datos básicos : número, cadena, booleano, nulo, indefinido, símbolo (nuevo en ES6), BigInt (nuevo en ES11)
- Tipo de datos de referencia : objeto (objeto simple, función, fecha, matemática, matriz, etc.)
tipo de datos básicos
característica
- Un objeto contenedor (Número, Cadena, etc.) que contiene el valor primitivo correspondiente .
- Segmento de datos simple almacenado en la memoria de pila .
- Los datos son inmutables, es decir, no se pueden modificar a la fuerza
Array.prototype.sort.call('abc')
y la modificación informará de un error. - No hay ninguna
_proto_
propiedad .
juicio
- Puede utilizar
typeof
para determinar el tipo de datos. - Cabe señalar aquí que
typeof(null) == 'object'
el tipo de nulo se juzgará erróneamente como object .null
La obtención de errores de detección es un problema que quedó en la historia. EnJS
la versión inicial de , se utilizó un sistema de 32 bits. Por consideraciones de rendimiento, se utilizó la información de tipo de variables de almacenamiento de bajo orden.000
El comienzo representaba un objeto peronull
representaba todos los ceros. , por lo que se calculó erróneamente comoobject
.
tipo | resultado |
---|---|
Cadena | "cadena" |
Número | "número" |
booleano | "booleano" |
Indefinido | "indefinido" |
Objeto, Matriz, RegExp, nulo, Fecha, Error | "objeto" |
Función | "función" |
Símbolo (nuevo en ES6) | "símbolo" |
BigInt (nuevo en ES11) | "Empezando" |
Número
- El número se puede definir directamente usando números o notación científica.
- La clase de datos básica Número en JavaScript es un número de coma flotante de precisión doble. El rango seguro máximo que puede representar es más o menos 9007199254740991, es decir, 2 elevado a la 53 potencia menos 1, y todos los números mayores que 2 elevado a la 53 El poder se puede expresar
BigInt
.
let x1 = 34.00
let x2 = 34
let x3 = 123e5
let x4 = 123e-5
let x5 = new Number(123)
Yaya
- Aquí hay un punto de atención
typeof NaN
para Number. - La propiedad NaN es un valor especial que representa un valor no numérico. Este atributo se utiliza para indicar que un valor no es un número. Un objeto Número se puede establecer en este valor para indicar que no es un valor numérico.
- isNaN() función global para determinar si un valor es un valor NaN.
typeof NaN === "number" // true
// NaN 同任何数比较均为false
NaN === NaN // false
isNaN("0") // false
isNaN("ssss") // true
Empezando
- Un Bigint se puede definir agregando un literal entero
n
o llamando a una funciónBigInt()
sinnew
operadores, que no se puede inicializar connew
la palabra clave . BigInt
es un nuevo tipo primitivo en JavaScript que puede representar números enteros con precisión arbitraria . Con , los enteros grandes se pueden almacenar y manipular de forma segura,BigInt
incluso si superan los límites de enteros seguros de JavaScript .Number
- Añadido en ES11.
let x1 = 123n
let x2 = BigInt(123)
- BigInt es diferente de Número.
- No se puede utilizar para
Math
métodos en objetos. - No se puede mezclar con ninguna
Number
instancia, ambas deben convertirse al mismo tipo. Tenga cuidado al convertir los dos tipos de un lado a otro, ya que las variables pueden perder precisión cuandoBigInt
se convierten en variables.Number
- No se puede utilizar para
Cadena
- Una cadena se puede definir directamente usando una cadena.
- Además de nulo, indefinido, otros pueden
toString
obtener el valor de su cadena correspondiente a través del método.
let s1 = "qwe"
let s2 = new String("sad")
let s3 = 'sdg'
let s4 = `dbs`
({
}).toString() // [object Object]
(123).toString() // "123"
// 字符串与其他类型相加会发生奇怪的事情
{
} + '' // 0
[] + '' // ''
booleano
-
verdadero y falso son booleanos.
-
Solo los siguientes siete valores son falsos en JS .
- indefinido
- nulo
- FALSO
- Yaya
- ''
- 0
- -0
-
Todo lo demás es cierto .
Boolean(null) // false
Boolean(undefined) // false
Boolean(4) // false
Nulo
- null es el tipo de datos nulo.
- Su expresión es nula. A menudo se utiliza para liberar memoria o inicializar tareas. Es igual a indefinido, pero no estrictamente igual a indefinido.
let a = null
undefined == null // true
undefined === null // false
Indefinido
- undefined es el tipo de datos Undefined.
- Su significado es indefinido, o definido sin asignar. Es igual a nulo, pero no estrictamente igual a nulo.
let a = undefined
null == undefined // true
null === undefined // false
Símbolo
Los nombres de las propiedades de los objetos de ES5 son todas cadenas, lo que puede causar fácilmente conflictos de nombres de propiedades. Por ejemplo, si usa un objeto proporcionado por otros, pero desea agregar un nuevo método (modo mixin) a este objeto, el nombre del nuevo método puede entrar en conflicto con el método existente. Sería genial si hubiera un mecanismo para garantizar que el nombre de cada atributo sea único, para evitar fundamentalmente conflictos de nombres de atributos. Es Symbol
por eso que ES6 lo presentó.
Symbol
, que representa un valor único.- Los valores de los símbolos son
Symbol()
generados por funciones. - Hay dos tipos de nombres de atributo de objeto, uno es la cadena original y el otro es el tipo de símbolo recién agregado. Todos los nombres de atributos que pertenecen al tipo Símbolo son únicos y se puede garantizar que no entren en conflicto con otros nombres de atributos.
let s = Symbol();
typeof s
// "symbol"
let s1 = Symbol('foo');
let s2 = Symbol('bar');
s1 // Symbol(foo)
s2 // Symbol(bar)
s1.toString() // "Symbol(foo)"
s2.toString() // "Symbol(bar)"
- Si quieres saber más al respecto, puedes leer el artículo del profesor Ruan Yifeng, que está muy bien escrito: Symbol - Getting Started with ECMAScript 6 (ruanyifeng.com)
tipo de datos de referencia
característica
- Se asignan dos espacios cuando se crea un tipo de referencia
- Una pieza está en el montón , almacenando los datos del tipo de referencia en sí (por supuesto, la cantidad de datos será relativamente grande)
- Una pieza está en la pila , almacenando referencias a datos en el montón (almacenando direcciones de memoria en el montón, es decir, punteros)
- Los tipos de referencia son mutables: es decir
let a={}; a.x=1;
function
Los parámetros se pasan por valor, las referencias no se pueden modificar
juicio
- Pase la
Object.prototype.toString.call
detección
let a = function (){
}
let b = []
let c = {
}
Object.prototype.toString.call(a) // [object Function]
Object.prototype.toString.call(b) // [object Array]
Object.prototype.toString.call(c) // [object Object]
typeof a // function
typeof b // object
typeof c // object
Objeto
- JS todo es un objeto
- JavaScript proporciona varios objetos integrados como String, Date, Array, etc. Los objetos son solo tipos de datos especiales con propiedades y métodos.
- Boolean puede ser un objeto.
- Un tipo numérico puede ser un objeto.
- Una cadena también puede ser un objeto.
- la fecha es un objeto
- Las matemáticas y las expresiones regulares también son objetos.
- matriz es un objeto
- Incluso las funciones pueden ser objetos.
let x1 = {
}
let x2 = new Object()
// 基本类型的包装类 使用typeof判为object
let x3 = new String()
let x4 = new Number()
typeof x1 // "object"
typeof x2 // "object"
typeof x3 // "object"
typeof x4 // "object"
Función
- Una función es un tipo especial de objeto.
- Una función también es un bloque de código funcional, una secuencia de comandos con un intervalo cerrado corto.Si la misma pieza de código se usa varias veces, se puede encapsular en una función, lo que permite que se use según sea necesario en el código.
- Encapsulación de números para evitar escribir repetidamente una gran cantidad del mismo contenido, pero el poder real de la función radica en la capacidad de pasar parámetros, puede pasarles diferentes datos y usar estos datos para completar la operación predeterminada
- Las funciones son ciudadanos, objetos y valores de primera clase que se pueden almacenar en una variable, matriz u objeto
- Las funciones se pueden pasar a funciones y ser devueltas por funciones, y las funciones tienen propiedades
- Una función siempre tiene un valor de retorno (en otras palabras, hay una declaración de retorno, a excepción de la función constructora, porque devolverá la llamada a la función constructora de forma predeterminada, y cuando se ejecute la llamada al constructor, devolverá la pantalla)
var funA = function(){
console.log("我是匿名函数保存在变量funA中");
}
var funB = [function(){
console.log("我是匿名函数保存在数组funB中");
}]
var funC = {
method:function(){
console.log("我是匿名函数保存在对象funC中");
}
}
// 函数的调用
funA(); // 普通函数的调用
funB[0](); // 函数存入数组中的调用
funC.method(); // 对象调用方法的使用
⭐Lo anterior es todo el contenido de este artículo, si te es útil, por favor regálame un me gusta