Aprender un lenguaje de programación tiene solo dos aspectos: uno es la sintaxis y el otro es el tipo de datos. La sintaxis de los idiomas tipo C no es más que si, mientras, para las funciones, las operaciones aritméticas, etc., y los idiomas orientados a objetos se agregan al objeto.
La sintaxis es solo un conjunto de reglas que los diseñadores de idiomas han hecho de antemano. La gramática de diferentes idiomas es diferente, pero todos tienen algunos puntos comunes. Para aquellos que están familiarizados con uno o dos lenguajes de programación, la gramática a menudo no es un problema al aprender otros lenguajes de programación (por supuesto, si ha estado aprendiendo lenguajes similares a C, entonces definitivamente tomará un tiempo involucrarse en LISP por primera vez). El enfoque del aprendizaje a menudo se encuentra en los tipos de datos y las operaciones relacionadas, y no hay un viejo dicho: "Estructura de datos + algoritmo = programa"! En segundo lugar, la sintaxis de algunos idiomas tiene problemas de diseño (JavaScript es aún más así), por lo que no necesitamos profundizar en estos puntos. Por supuesto, si afirma ser geek, puede jugar con él.
Este artículo dará una introducción detallada a los tipos de datos en JavaScript.
Tipo débil vs tipo fuerte
Dada la filosofía de diseño de JavaScript, JavaScript está diseñado como un lenguaje débil.
Hablando de esto, es inevitable hablar sobre la diferencia entre los tipos débiles y los tipos fuertes.
Algunas personas piensan erróneamente que la diferencia entre los dos es que "un lenguaje fuertemente escrito debe indicar su tipo al declarar una variable, mientras que uno débilmente escrito no lo usa". De hecho, este punto de vista es incorrecto. Por ejemplo, el siguiente fragmento de código Java:
La copia del código es la siguiente:
Cadena s = "hola";
int l = s.getBytes (). Longitud;
¿Cómo sabe el compilador que la longitud es una expresión legal? Esto se debe a que el compilador sabe que el tipo de datos de S es una cadena. Cuando se llama al método de cadena GetBytes, el tipo de datos del valor de retorno es byte [], por lo que la longitud es una expresión legal.
La verdadera diferencia entre los dos es:
En idiomas fuertemente tipados, el tipo de cada expresión se puede determinar en el tiempo de compilación y solo se permiten operaciones que se aplican a ese tipo;
Los idiomas de tipo débil permiten imponer cualquier operación en cualquier tipo, pero esta operación puede informar un error en tiempo de ejecución.
Tipo de datos
Según la especificación de ECMAScript 5.1, hay seis tipos de datos en JavaScript, a saber: indefinido, nulo, booleano, número, cadena y objeto. Los primeros cinco pertenecen al tipo básico, y el último pertenece al tipo de objeto.
Tipos de datos básicos
El tipo indefinido tiene solo un valor, que está indefinido, que significa "valor nulo", que se aplica a todos los tipos de datos.
El tipo nulo tiene solo un valor, que es nulo, que significa "sin objeto" y solo se aplica a los tipos de objetos.
El tipo booleano tiene dos valores, verdadero y falso
Los valores del número de tipo son conjuntos de números de punto flotante de 64 bits que siguen el estándar IEEE 754, similar al doble de Java. No hay estructura de datos enteros. Además, hay tres valores especiales: Nan, Infinity, -Infinity
Un valor del tipo de cadena es una colección de caracteres unicode finitos. Debe estar encerrado con 'o'.
nulo e indefinido
Tanto nulo como indefinido representan el concepto de "no valor", si se distingue estrictamente:
- nulo significa vacío
- Undefinado significa que no existe. Este valor es todas las variables sin inicialización, parámetros faltantes en la función y sin valor de retorno explícito.
En otros idiomas, solo se usa un nulo para representar valores nulos. ¿Por qué hay un indefinido en JavaScript? Esto es causado por razones históricas:
JavaScript adopta la sintaxis de Java, divide los tipos en tipos básicos y tipos de objetos. En Java, NULL se usa para representar objetos vacíos, y JavaScript los hereda por sentado; En el lenguaje C, NULL es 0 cuando se convierte a un número, y JavaScript también adopta el mismo método:
La copia del código es la siguiente:
> Número (nulo)
0
> 5 + nulo
5
En JavaScript 1.0, todavía no hay un manejo de excepciones. Para algunas excepciones (no hay variables inicializadas, los parámetros faltantes al llamar a las funciones, etc.), deben marcarse como un valor especial. NULL es una buena opción, pero Brendan Eich quiere evitar las siguientes dos cosas:
- Este valor especial no debe tener un atributo de referencia, porque es específico
- Este valor especial no debe convertirse a 0, porque no es fácil detectar errores en el programa
Por estas dos razones, Brendan Eich eligió indefinido, que puede verse obligado a nan.
La copia del código es la siguiente:
> Número (indefinido)
Yaya
> 5 + indefinido
Yaya
Los resultados son muy diferentes cuando se trata de objetos JSON:
La copia del código es la siguiente:
> JSON.PARSE (NULL)
nulo
> Json.parse (indefinido)
// Firfox SyntaxError: Json.Parse: carácter inesperado en la línea 1 Columna 1 de los datos JSON
// Chrome SyntaxError: token inesperado u
> Json.stringify (nulo)
"nulo"
> Json.stringify (indefinido)
indefinido
Tipo de objeto
Como lenguaje de secuencias de comandos, el propio JavaScript tiene funciones muy simplificadas, y el entorno host proporciona muchas funciones (lectura y escritura de archivos, redes, etc.). El puente entre el entorno de host y el idioma JavaScript son los objetos. El entorno host proporciona una variedad de funciones al proporcionar una serie de objetos que se ajustan a la sintaxis de JavaScript.
En este artículo en la programación orientada a objetos de JavaScript (si no sabe qué es un prototipo, recomiendo leer este artículo), he enfatizado repetidamente que los objetos son una serie de pares de valor clave en JavaScript, al igual que HASHMAP en Java. Sin embargo, las propiedades de los objetos en JavaScript pueden tener algunos descriptores (descriptores de propiedades), que no están disponibles en HashMap.
Descriptor de atributos
Los descriptores de atributos se dividen en dos categorías:
El descriptor de datos (descriptor de datos) contiene una serie de valores booleanos, para indicar si el atributo permite la modificación y eliminación.
Descriptor de accesorios, incluidas las funciones GET y SET.
Ambos descriptores son objetos, y ambos tienen las siguientes dos propiedades booleanas:
Configurable se utiliza para especificar si el descriptor permite modificar y eliminar. El valor predeterminado es falso.
Enumerable se usa para especificar si se debe acceder a la propiedad cuando está atravesando un objeto (usando el método For ... en Loop o el Object. Keys). El valor predeterminado es falso.
Además de los dos atributos comunes anteriores, el descriptor de datos tiene los siguientes dos atributos:
- El valor se utiliza para especificar el valor de esta propiedad, el valor predeterminado está indefinido
- Writable se utiliza para especificar si el valor de la propiedad permite el cambio del valor de la propiedad. El valor predeterminado es falso
Hay dos propiedades para descriptores de acceso:
- Get se utiliza para especificar el accesor (Getter, esencialmente una función) al acceder a la propiedad, y el valor de retorno del accesor es el valor de la propiedad. El valor predeterminado está indefinido
- El conjunto se utiliza para especificar el evaluador (setter, esencialmente una función) al acceder a esta propiedad. El evaluador acepta un parámetro. El valor predeterminado está indefinido
Podemos usar Object.DefineProperty para establecer el descriptor de propiedades del objeto. Por ejemplo:
La copia del código es la siguiente:
// usando __proto__
Object.defineProperty (obj, 'key', {
__proto__: nulo, // sin propiedades heredadas
Valor: 'estático' // No enumerable
// no configurable
// no escrito
// Como predeterminado
});
Del ejemplo anterior, podemos ver que los descriptores tienen las características de la herencia. Establecemos explícitamente el __proto__ del objeto descriptor a NULL, que evita heredar los atributos correspondientes de Object.proTotype. Por supuesto, también podemos establecer explícitamente todas las propiedades del descriptor:
La copia del código es la siguiente:
// Ser explícito
Object.defineProperty (obj, 'key', {
enumerable: falso,
configurable: falso,
Writable: Falso,
Valor: 'estático'
});
Este efecto es el mismo que la primera pieza de código.
Aquí hay otro ejemplo de descriptor de acceso:
La copia del código es la siguiente:
// Ejemplo de una propiedad de objeto agregada con DefineProperty con un descriptor de propiedades de accesor
var bvalue = 38;
Object.defineProperty (obj, 'key', {
get: function () {return bValue; },
set: function (newValue) {bvalue = newValue; },
enumerable: verdadero,
configurable: verdadero
});
Cabe señalar que los descriptores de acceso y los descriptores de datos no pueden confundirse. Está mal escribir lo siguiente:
La copia del código es la siguiente:
// No puedes intentar mezclar ambos:
Objeto.defineProperty (obj, 'conflicto', {
Valor: 0x9f91102,
get: function () {return 0xDeadBeef; }
});
// Lanza un TipoError: los descriptores de propiedades no deben especificar un valor
// o ser escribida cuando se ha especificado un Getter o Setter
tipo de tono
Si desea saber el tipo de variable en tiempo de ejecución, puede usar el operador de typeOf. El valor de retorno de typeof es el siguiente:
Una cosa que debe tenerse en cuenta es typeOf null == "objeto". Según el estándar EcMascript 5.1, el tipo nulo debe ser un tipo básico. ¿Por qué se devuelve el objeto aquí? La razón es esta:
En JavaScript 1.0, el valor en JavaScript está representado por una estructura como una etiqueta de tipo y un valor real. El indicador tipo del objeto es 0, y NULL representa un puntero nulo (0x00) en el lenguaje C, por lo que el indicador de tipo de NULL es 0.
Lo anterior es todo el contenido de este artículo. Consultelo si lo necesita.