El diseño del lenguaje JavaScript no es lo suficientemente riguroso, y muchos lugares cometerán errores si no tiene cuidado.
Por ejemplo, considere las siguientes situaciones.
Ahora, necesitamos determinar si existe un objeto global myobj, y si no existe, declararlo. El algoritmo descrito en el lenguaje natural es el siguiente:
if (myobj no existe) {declarar myobj; }Puede que le resulte fácil escribir este código. Pero, de hecho, los problemas gramaticales que implica son mucho más complicados de lo que pensamos. Juriy Zaytsev señaló que hay más de 50 formas de determinar si existe un objeto JavaScript. Solo cuando los detalles de implementación del lenguaje JavaScript son muy claros, se pueden distinguir.
La primera forma de escribir
Según su intuición, puede pensar que puede escribir esto:
if (! myobj) {myobj = {}; }Sin embargo, si ejecuta este código, el navegador lanzará directamente un error de referencia, lo que hace que la operación sea interrumpida. ¿Qué ocurre?
Por cierto, cuando la instrucción IF determina si Myobj está vacía, esta variable aún no existe, por lo que se informará un error. Cámbielo a lo siguiente y se ejecutará correctamente.
if (! myobj) {var myobj = {}; }¿Por qué no se informa el error después de agregar un VAR? ¿Myobj ya existe en este caso cuando la declaración IF hace juicios?
Para responder a esta pregunta, debe saber cómo funciona el intérprete JavaScript. El lenguaje JavaScript es "Parse primero, ejecutar más tarde". La declaración de la variable se completa durante el análisis, por lo que el código anterior es realmente equivalente a:
var myobj; if (! myobj) {var myobj = {}; }Por lo tanto, cuando la declaración IF hace juicios, Myobj existe, por lo que no hay error. Este es el efecto "Mejora del código" del comando VAR. El intérprete JavaScript solo "eleva" las variables definidas por el comando VAR, y no funciona para variables que no usan el comando VAR y asignan directamente. Es por eso que causará un error si no agrega VAR.
La segunda forma de escribir
Además del comando VAR, puede haber otra reescritura y también puede obtener el resultado correcto:
if (! window.myobj) {myobj = {}; }La ventana es el objeto de nivel superior de JavaScript, y todas las variables globales son sus propiedades. Por lo tanto, juzgar si MyOBJ está vacío es equivalente a juzgar si el objeto de la ventana tiene el atributo myobj, para evitar el error de referenceError porque Myobj no está definido. Sin embargo, desde la estandarización del código, es mejor agregar VAR a la segunda línea:
if (! window.myobj) {var myobj = {}; }O escríbelo así:
if (! window.myobj) {window.myobj = {}; }La tercera forma de escribir
La desventaja del método de escritura anterior es que en algunos entornos operativos (como V8 y Rhino), la ventana puede no ser un objeto de nivel superior. Entonces, considere reescribirlo como:
if (! this.myobj) {this.myobj = {}; }En el nivel de variable global, esta palabra clave siempre apunta a la variable de nivel superior, por lo que puede ser independiente de diferentes entornos operativos.
La cuarta forma de escribir
Sin embargo, la escritura anterior es mal legible, y la señalización de esto es variable y propensa a errores, por lo que se reescribe aún más:
var global = this; if (! global.myobj) {global.myobj = {}; }Es mucho más claro usar la variable personalizada Global para representar el objeto de nivel superior.
La quinta forma de escribir
También puede usar el operador TypeOf para determinar si MyOBJ está definido.
if (typeOf myobj == "Undefined") {var myobj = {}; }Este es el método más utilizado para determinar si existe un objeto JavaScript.
La sexta forma de escribir
Dado que el valor de myobj es directamente igual a indefinido en el caso de definido pero no asignado, el método de escritura anterior puede simplificarse:
if (myobj == undefined) {var myobj = {}; }Hay dos lugares para tener en cuenta aquí. Primero, las palabras clave VAR en la segunda línea no deben faltar, de lo contrario se producirá un error de reference. En segundo lugar, no se puede agregar undefinado con cotizaciones simples o dobles, porque el tipo de datos de indefinido se compara aquí, en lugar de la cadena "indefinida".
La séptima forma de escribir
El método de escritura anterior sigue siendo válido bajo la condición de "comparación precisa" (===):
if (myobj === undefined) {var myobj = {}; }La octava forma de escribir
Según el diseño del lenguaje de JavaScript, indefinido == NULL, por lo que también puede obtener el resultado correcto comparando si MyOBJ es igual a NULL:
if (myobj == null) {var myobj = {}; }Sin embargo, aunque el resultado de la operación es correcto, semánticamente, este método de juicio es incorrecto y debe evitarse. Debido a que NULL se refiere a un objeto vacío que se ha asignado a NULL, es decir, este objeto es realmente valorado, mientras que indefinido se refiere a un objeto que no existe o no tiene tarea. Por lo tanto, solo puede usar el "Operador de comparación" (==) aquí, y si usa el "Operador de comparación exacto" (===) aquí, recibirá un error.
La novena forma de escribir
También puede usar el operador in para determinar si myobj es un atributo del objeto de nivel superior:
if (! ('myobj' en ventana)) {window.myobj = {}; }La décima forma de escribir
Finalmente, use el método de HaswnProperty para determinar si MyOBJ es una propiedad del objeto de nivel superior:
if (! this.hasownproperty ('myobj')) {this.myobj = {}; }Resumir
1. Si solo determina si el objeto existe, se recomienda usar el quinto método de escritura.
2. Si además de si el objeto existe, también es necesario determinar si el objeto tiene un valor nulo, se recomienda utilizar el primer método de escritura.
3. A menos que se especifique lo contrario, todas las variables deben declararse utilizando el comando VAR.
4. Para la multiplataforma, se recomienda evitar el uso de la ventana para representar objetos de nivel superior.
5. En el idioma JavaScript, nulo y indefinido son propensos a la confusión. En los casos en que ambos pueden estar involucrados, se recomienda utilizar el operador de "comparación exacta" (===).
(encima)
El simple ejemplo simple de cómo juzgar si existe un objeto JavaScript es todo el contenido que he compartido con usted. Espero que pueda darle una referencia y espero que pueda apoyar más a Wulin.com.