Contactos

Tipo de operador de recepción. JavaScript, TipoF, Tipos y clases Javascript Comprobar el tipo de variable

Identificación dinámica de tipos.

Identificación de tipo dinámico (RTTI) Le permite determinar el tipo de objeto durante la ejecución del programa. Resulta que es útil por varias razones. En particular, por referencia a la clase base, es posible determinar con bastante precisión el tipo de objeto disponible en este enlace. La identificación dinámica de los tipos también permite verificar de antemano qué tan exitoso será el resultado del tipo de tipo que traerá, previniendo la situación exclusiva en relación con la visualización incorrecta de los tipos. Además, la identificación dinámica de los tipos es el componente principal de la reflexión.

Para admitir la identificación dinámica de los tipos en C #, se proporcionan tres palabras clave: es, como y tipo de tipo. Cada una de estas palabras clave se considera a su vez más a su vez.

El operador es.

El tipo específico de objeto se puede determinar utilizando el operador. A continuación se muestra su forma común:

es la expresión de tipo

donde la expresión denota una expresión separada que describe el objeto cuyo tipo está marcado. Si la expresión tiene un tipo compatible o el mismo tipo que el tipo revisado, el resultado de esta operación es verdadero, de lo contrario falso. Por lo tanto, el resultado será cierto si la expresión tiene un tipo verificable en una forma u otra. En la declaración de tipo es, ambas se definen como compatibles si son el mismo tipo o si se proporciona transformación de referencia, envases o desembalaje.

A continuación se muestra un ejemplo de usar un operador es:

Utilizando sistema; Consolapplicación de espacio de nombres1 (Clase Agregar () Clase Suma: Agregar () Programa de clase (Página principal de vacío estático () (Agregar A \u003d NUEVO AÑADIR (); SUM S \u003d NUEVO SUM (); IF (A ADD ADD) Console.Writeline ("Variable A tiene un tipo agregado "); si (s es suma) console.writeline (" El tipo de variable S se hereda de la clase AD "); console.readline ();)))

Operador como

A veces, se requiere la conversión de tipo durante la ejecución, pero no genere una excepción si el resultado de esta conversión no tendrá éxito, lo que es bastante posible cuando se dan los tipos. Para este propósito, el operador AS tiene la siguiente forma:

como expresión de tipo

donde la expresión denota una expresión separada que se convierte en el tipo especificado.

Si el resultado de tal conversión resulta tener éxito, entonces se devuelve el enlace al tipo y, de lo contrario, es un enlace vacío. El operador AS solo se puede usar para convertir enlaces, identidad, embalaje, desempaque. En algunos casos, el operador AS puede servir como una alternativa conveniente al operador. Como ejemplo, considere el siguiente programa:

Utilizando sistema; Consolapplication de espacio de nombres1 (clase Agregar () Clase Suma: Agregar () Programa de clase (Página principal de vacío estático (); suma S \u003d nueva suma (); // Realizar el tipo A \u003d S AD; SI (A! \u003d NULL) Console.Writeline ("La conversión ha sido exitosa"); Else console.writeline ("Error conversión"); consola.readline ();)))

El resultado de este programa será una conversión exitosa.

a \u003d (b\u003e 0) && (C + 1! \u003d D); Bandera \u003d! (Estado \u003d 0);

Tabla 14.5. Operadores lógicos

Descripción del operador

! No (inversión lógica)

&& Y (multiplicación lógica)

|| O (adición lógica)

Tabla 14.6. Los resultados de la ejecución de los operadores y o

Operando 1.

Operand 2.

Tabla 14.7. Los resultados de la ejecución del operador no

Operador de recibo de tipo

Operador de recibos de tipotipoF devuelve una cadena que describe el tipo de datos de operando. Operand, el tipo de lo que necesita saber se coloca después de este operador y entré en paréntesis:

s \u003d typef ("str");

Como resultado de la ejecución de esta expresión en la variable S, será una "cadena" de cadena, que denota un tipo de cadena.

Todos los valores que el Operador TipoF puede devolver se enumeran en la Tabla. 14.8.

Tabla 14.8. Valores devueltos por el tipo de operador.

Tipo de datos

Linea de retorno

Cuerda

Numérico

Tabla 14.8 (FINAL)

Tipo de datos

Linea de retorno

Lógico

Conversión de tipo de compatibilidad y tipo de datos.

Es hora de considerar dos temas más importantes: la compatibilidad de los tipos de datos y la conversión de un tipo a otro.

¿Qué pasa si se doblan dos valores numéricos? Eso es correcto, otro valor numérico. ¿Y si dobla el número y la cadena? Es difícil decir ... aquí JavaScript se enfrenta al problema de la incompatibilidad de los tipos de datos y trata de hacer que estos tipos sean compatibles, transformando uno de ellos a otro. Primero, trata de convertir una fila al número y, si se administra, realiza una adición. En caso de fallo, el número se transformará en la cadena, y las dos filas obtenidas se combinarán. Por ejemplo, como resultado de la implementación del escenario web de la listado 14.6, el valor de la variable B cuando se agrega de la variable A se convertirá en un tipo numérico; Por lo tanto, la variable C contendrá un valor 23.

LISTA 14.6.

var a, b, c, d, e, f; a \u003d 11;

b \u003d "12"; c \u003d a + b;

d \u003d "javascript"; E \u003d 2;

Pero dado que el valor de la variable D no se puede convertir a un número, el valor de E se convertirá en la cadena, y el resultado, el valor de F - será igual

Los valores lógicos se convierten a numéricos o en cadena, dependiendo del caso específico. El verdadero valor se convertirá al número 1 o la cadena "1", y el valor falso, en 0 o "0". A la inversa, el número 1 se convertirá en verdadero, y el número 0 es en falso. También en falso será transformado.

valores nulos e indefinidos.

Parte III. Páginas web de comportamiento. Escenarios web

Se puede ver que JavaScript lucha para realizar correctamente incluso expresiones escritas incorrectamente. A veces resulta, pero más a menudo todo funciona según lo planeado, y al final, la implementación del escenario web se interrumpe en relación con la detección de un error completamente en su otro lugar, en una declaración absolutamente correcta. Por lo tanto, es mejor prevenir tales incidentes.

Prioridad de los operadores

La última pregunta que veremos aquí están la prioridad de los operadores. Como recordamos, la prioridad afecta el orden en que los operadores se realizan en la expresión.

Deja que haya la siguiente expresión:

En este caso, se agregará primero al valor de la variable B, y luego se deducirá 10 de la cantidad. Los operadores de esta expresión tienen la misma prioridad y, por lo tanto, se ejecutan estrictamente de izquierda a derecha.

Ahora considera tal expresión:

Aquí, primero se realizará la multiplicación del valor de C por 10, y solo el valor B se agregará al resultado. El operador de multiplicación tiene una mayor prioridad que el operador de la adición, por lo que el orden "estrictamente de izquierda a derecha" se romperá.

La prioridad más baja para los operadores de asignación. Es por eso que la expresión en sí misma se calcula primero, y luego su resultado se asigna a una variable.

EN en general, el principio básico del cumplimiento de todos los operadores es el siguiente: los primeros operadores se realizan con una prioridad más alta, y solo los operadores posteriores con menor. Los operadores con la misma prioridad se realizan en el orden de ellos (de izquierda a derecha).

EN mesa. 14.9 Los operadores estudiados por nosotros se enumeran en el orden de sus prioridades.

Tabla 14.9. Prioridad de los operadores (en orden descendente)

Operadores

Descripción

++ - - ~! Tipo de.

Incremento, decremento, cambio de signo, no lógico, no, definición

Multiplicación, división, tomando un saldo

Adición y fusión de filas, resta.

Comparación de los operadores

Lógica I.

Capítulo 14. Introducción a la programación web. Lenguaje javascript

Tabla 14.9 (FINAL)

Operadores

Descripción

Lógico o

Operador Condicional (ver más abajo)

= <оператор>=

Asignación, simple y compleja.

¡ATENCIÓN!

Recuerda esta tabla. El procedimiento incorrecto para la realización de operadores puede causar errores difíciles en los que la expresión absolutamente correcta externamente da un resultado incorrecto.

Pero, ¿y si necesitamos romper el orden habitual de ejecución de los operadores? Utilizamos paréntesis. Con tal entrada entre paréntesis, los operadores se realizan primero:

a \u003d (B + C) * 10;

Aquí, primero se completará la adición de valores de variables B y C, y luego la cantidad resultante se multiplicará por 10.

Los operadores encerrados entre paréntesis también están sujetos a prioridad. Por lo tanto, se utilizan a menudo soportes múltiples:

a \u003d ((B + C) * 10 - D) / 2 + 9;

Aquí los operadores se realizarán en tal secuencia:

1. Adición B y C.

2. Multiplicando la cantidad recibida por 10.

3. Restar D desde el trabajo.

4. División de una diferencia para 2.

5. Adjunt a 9 a privado.

Si eliminas los soportes:

a \u003d B + C * 10 - D / 2 + 9;

el orden de ejecución de los operadores será:

1. Multiplicación C y 10.

2. Dividiendo D a 2.

3. Adición B y trabaja C y 10.

4. Resta de la cantidad recibida de la división privada.d 2.

5. Ajustado 9 a la diferencia obtenida.

Resulta un resultado completamente diferente, ¿verdad?

JavaScript. o Js. (Abreviado) No es un lenguaje simple y los desarrolladores novatos no lo sabrán de inmediato. Al principio reconocen lo básico y todo parece colorido y hermoso. Buscando un poco más profundo, JavaScript aparece matrices, objetos, devoluciones de llamada y todo lo que a menudo hace el cerebro.

JavaScript es importante para verificar correctamente el tipo de variable. Supongamos que desea saber si una variable con una matriz u objeto? ¿Cómo comprobarlo bien? En este caso particular, hay trucos durante la inspección y esta será esta entrada. Vamos a continuar inmediatamente.

Cheque de tipo variable

Por ejemplo, debe verificar que es una variable de objeto, una matriz, una cadena o un número. Para hacer esto, puede usar TipoF, pero no siempre le dará la verdad y, en el siguiente ejemplo, mostraré por qué.

Escribí este ejemplo para mostrar vívidamente por qué TipoF no siempre es la opción correcta.

Var _comparison \u003d (cadena: "cadena", int: 99, flotador: 13.555, objeto: (hola: "hola"), matriz: nueva matriz (1, 2, 3)); // devuelve una matriz con las teclas del objeto VAR _OBJKEYS \u003d Object.Keys (_comparison); para (var i \u003d 0; i<= _objKeys.length - 1; i++) { // выведем в консоль тип каждой переменной console.log(typeof _comparson[_objKeys[i]]); }

Resultado de la ejecución del código:

Objeto número número objeto objeto

¿Derecha? - Por supuesto que no. Hay dos problemas. Cada uno de ellos se describirá en detalle y se sugirió.

Primer problema: número de flotador, salida como número

Comparación. Flotar no es un número y, en lugar de número, debe ser flotando (un número de punto flotante). Esto es fijo, puede crear una función de verificación como en el código a continuación.

Var _floatnumber \u003d 9.22; var _notfloatnumber \u003d 9; Console.log (isfloat (_floatnumber)); Console.log (isfloat (_notfloatnumber)); Console.log (isfloat (")); Función IsFloat (N) (Número de retorno (N) \u003d\u003d\u003d N && N% 1! \u003d\u003d 0;)

La función ISFLOAT () realiza la comprobación de todos los valores a los números de puntos flotantes. Se marca primero si la variable es igual nORTE. Número (Número (N) \u003d\u003d\u003d N) y en caso afirmativo, entonces se realiza otra verificación de validación con el residuo y si hay un residuo, entonces regresa Buleva ( cierto. o falso) Resultado (n% 1! \u003d\u003d 0).

En el ejemplo anterior, devuelve. cierto., falso y falso. El primer valor es flotadorescriba, el segundo no es, este es el número habitual y la última cadena vacía que no se adapta a las reglas.

Segundo problema: la matriz se determinó como objeto.

En el primer ejemplo, la matriz se mostró como un objeto y no es muy bueno, ya que a veces necesitas usar este tipo en particular y nada más.

Hay varias formas de verificar la variable en el tipo de matriz.

Primera opción (buena opción). Compruebe el accesorio de datos a la matriz usando InscritoF ().

Var datos \u003d nueva matriz ("hola", "mundo"); Var isarr \u003d instancia de datos de matriz;

Segunda versión (buena opción). El método Array.Sarray () devuelve el valor booleano, que dependerá de si la variable es una matriz o no ().

Var datos \u003d nueva matriz ("hola", "mundo"); var isarr \u003d array.isarray (datos);

Tercera opción (lo mejor, pero largo). Para mayor comodidad, puede hacer esta forma. Usando el objeto, lo hacemos. Si el objeto de resultado.Prototype.Tostring.call (datos) no es igual a la variable no es una matriz ().

Var datos \u003d nueva matriz ("hola", "mundo"); var isarr \u003d objeto.prototype.tostring.call (datos) \u003d\u003d ""; Console.log (is ararr);

El último resultado en forma de una función conveniente:

Función ISARRAY (DATOS) (devolución de objetos.prototype.tostring.call (DATOS) \u003d\u003d ")

Ahora puede llamar a las funciones de Isarray () y como argumento para establecer una matriz o algo más y ver el resultado.

Palabra después

La grabación resultó bastante grande de lo que pensaba originalmente. Pero estoy satisfecho con eso, porque ella describe brevemente y claramente las dificultades al verificar las variables en JavaScript y cómo moverlas.

Si tiene alguna pregunta, escríbalos a continuación a este registro. Estaré encantado de ayudar.

  • Indefinido indefinido
  • Null: "objeto"
  • Booleano: "booleano"
  • Número: "Número"
  • Cadena: "cadena"
  • Función: "Función"
  • Todo lo demás: "objeto"

Los siguientes comentarios deben agregarse a esta tabla:

1. TipoF NULL \u003d\u003d\u003d "objeto".

Teóricamente aquí hay un momento sutil. En idiomas con escritura estática, la variable de tipo de objeto no contiene un objeto (nulo, nil, puntero cero).

Prácticamente - JavaScript es inconveniente. Por lo tanto, los desarrolladores de ES 5.1 van a hacer una cosa más intuitiva: TipoF NULL \u003d\u003d\u003d "NULL".

Pero como todavía tenemos un círculo de ES3, no cometemos un error, por ejemplo, en esto:

/ * La función está buscando algún objeto y lo devuelve o nulo si no se encuentra nada * / Búsqueda de funciones () () var obj \u003d búsqueda (); if (typef obj \u003d\u003d\u003d "objeto") (// si realmente encontramos un objeto (falla) obj.method ();)

2. No se olvide de los objetos de envoltura (tipo de nuevo número (5) \u003d\u003d\u003d "objeto").

3. Y no se olvide de los navegadores correctos crean nada con objetos host.

No se sorprenda que Safari considere persistentemente a HTMLCollection por el tipo de función, y es decir, anteriormente a la 9ª versión, mantenga nuestra función de alerta favorita () para el objeto. También Chrome se usa para leer la rogex para la función, pero ahora parece estar formado y responde a su objeto.

encadenar ()

Tratar de averiguar el tipo de valor de acuerdo con su método Tostring () no tiene sentido. En todas las "clases", este método se anula para su.

Para la salida de la información de depuración, el método es bueno, pero el tipo de variable no lo determina.

Objeto.prototype.tostring ()

Aunque Tostring se anula dentro de las "clases" específicas, todavía tenemos su implementación inicial del objeto. Tratemos de usarlo:

Console.log (objeto .prototype .Tostring .call (valor));

console.log (objeto.prototype.tostring.call (valor));


Clinton diluye esta pulgotina

Curiosamente, este método funciona sorprendentemente bien.

Para los tipos escalares, regreso ,,,,

Lo gracioso es que incluso el nuevo número (5) en el que se devuelve el tipo de escriba.

En un método nulo e indefinido de dar fallas. Diferentes navegadores regresan, entonces esperan y, entonces, en general. Sin embargo, es fácil determinar el tipo de estos dos valores y sin él.

Interesante comienza cuando nos acercamos a los objetos (los que tienen typef \u003d\u003d\u003d "objeto").

los objetos incorporados funcionan, prácticamente, con una explosión:

  • {} —
  • Fecha -
  • Error -
  • REGEXP -

El único cae fuera de la lista de argumentos, que es eso.
Con objetos host, peor otra vez.

En IE, los objetos DOM comenzaron a convertirse en objetos "normales" solo desde la 8ª versión y luego, no hasta el final. Por lo tanto, en IE 6-8, todos estos objetos (htmlcollection, dominotemento, código de texto y al mismo tiempo documento y ventana) son simplemente accionados por.

En todos los demás navegadores (incluyendo IE9) con el resultado de TOSTRING, ya puede hacer algo. Aunque todo no es fácil: HTMLCollection está ahí, entonces. Ventana - luego, entonces. Pero a partir de esto ya puedes intentar excitar algo.

Más difícil con el dominio: se muestra en el formato: su formato para cada etiqueta. Pero aquí nos ayudará regularmente.

Con otros objetos host (en las pruebas de ubicación y navegador) sobre la misma historia. En todas partes, excepto es decir, pueden ser identificados por fila.

De las menos de usar objeto.prototype.Tostring ():

1. La posibilidad de esto no se consagra por la norma. Y deberíamos preferir regocijarse aquí que todo funciona tan bien, y no aplastar por algunos defectos.

2. Determinación del tipo en el patrón de sintaxis de la cadena devuelta por el método, que no es en absoluto para determinar el tipo, y aún se produce en la instalación a la que no se aplica, deja algún precipitado en la ducha.

3. En ello, es decir, como se puede ver, los objetos del host no se identifican normalmente.

Sin embargo, esto es una cosa completamente trabajadora cuando se usa junto con otros medios.


Diseñadores

Y finalmente, diseñadores. ¿Quién puede decir mejor sobre el objeto "Clase" en JS, si no es su diseñador?

Nulo e indefinido no tienen objetos o diseñadores de envoltura.

Los tipos escalares restantes de envoltura tienen, respectivamente, puede obtener un constructor:

(5) .constructor \u003d\u003d\u003d Número; (Número .nan) .constructor \u003d\u003d\u003d Número; (Verdadero) .constructor \u003d\u003d\u003d booleano; ("Cadena") .constructor \u003d\u003d\u003d cadena;

(5) .constructor \u003d\u003d\u003d Número; (Number.nan) .constructor \u003d\u003d\u003d Número; (Verdadero) .constructor \u003d\u003d\u003d booleano; ("Cadena"). Constructor \u003d\u003d\u003d cadena;

Pero Ejerciciof no pasa aquí:

5 instancef número; // Número falso .Nan instancia de número de // falsa ejemplo verdadero de Booleano; // false "cadena" de la cadena de la cadena; // Falso

5 instancef número; // NÚMERO FALSO.NAN INSCULTEF NUMERO; // falsa ejemplo verdadero de Booleano; // false "cadena" de la cadena de la cadena; // Falso

(FloncoF funcionará para un nuevo número (5) que sufre mucho tiempo (5))

Con funciones (que también son objetos) y Etarc que:

Console.log ((función () ()) Función de instancia); // Verdadero Console.log ((función () ()) .constructor \u003d\u003d\u003d Función); // Cierto.

console.log ((función () ()) Función de instancia); // Verdadero Console.log ((función () ()). Constructor \u003d\u003d\u003d Función); // Cierto.

Todas las clases incrustadas también son fácilmente identificadas por diseñadores: Array, Fecha, Regexp, error.

Un problema se produce aquí con argumentos, el constructor de qué objeto.

Y el segundo con el propio objeto, o más bien cómo atribuir el objeto creado a través del diseñador de usuarios.

Así que solo puedes definir el objeto básico:

obj instance de objeto;

Como una de las variantes de la definición, para mover todos los otros tipos posibles (matriz, error ...) y, si ninguno de los dos, no submina, "Objeto".

Diseñadores y objetos de host.

Con los objetos del host son peores.

Comencemos con el hecho de que, es decir, hasta la séptima versión inclusiva, no los considere en absoluto para objetos normales. Simplemente no tienen diseñadores y prototipos (en cualquier caso, el programador no los alcanza).

En otros navegadores son mejores. Los diseñadores son y puedes definir la clase de valor. Solo se les llama en diferentes navegadores de diferentes maneras. Por ejemplo, para HTMLCollection, el diseñador será HTMLCollection o Nodelist, o incluso NodelistConstructor.

También debe definir el diseñador básico para el dominio. En FF, esto, por ejemplo, HTMlelement, desde donde ya se hereda el htmldivel y otros.

El Firefox se lanza al Firefox por debajo de la 10ª versión y la ópera por debajo de 11. Hay un constructor de colección - Objeto.

constructor.name.

Más constructores tienen una propiedad de nombre que puede ser útil.

Contiene el nombre de la función de diseñador, por ejemplo, (5) .conStructor.name \u003d\u003d\u003d "Número".

Pero:
1. En es decir, ni siquiera es, incluso en el noveno.
2. En los objetos de host, los navegadores se empujan nuevamente cada uno, y muchas veces no tienen esta propiedad). En la ópera, el dominio es el nombre del diseñador en la función general.Prototype.
3. Argumentos de nuevo "objeto".

conclusiones

Ninguno de los métodos presentados proporciona un cien por ciento de definición del tipo / clase de valor en todos los navegadores. Sin embargo, en el agregado les permiten hacerlo.

En un futuro próximo, intentaré recopilar todos los datos en los signos y daré un ejemplo de la función de definición.



¿Te gustó el artículo? Compártelo