Las Pautas de estilo de jQuery Core sugieren dos formas diferentes de verificar si una variable está definida.
- Variables globales:
typeof variable === "undefined"
- Variables locales
variable === undefined
- Propiedades:
object.prop === undefined
¿Por qué jQuery usa un enfoque para variables globales y otro para locales y propiedades?
javascript
jquery
undefined
Patrick McElhaney
fuente
fuente
foo === undefined
se compara con la copia local de undefined en lugar de la global (window.undefined), que puede haber sido modificada por un código loco. Vale la pena señalar el hecho de que indefinido es mutable y me alegro de que lo haya hecho. (+1)Respuestas:
Para las variables no declaradas,
typeof foo
devolverá el literal de cadena"undefined"
, mientras que la verificación de identidadfoo === undefined
activaría el error "foo no está definido" .Para las variables locales (que sabe que se declaran en alguna parte), no se produciría dicho error, de ahí la verificación de identidad.
fuente
typeof foo; // -> "undefined"
) para enfatizar que es una cadena y no el valor primitivoundefined
.Me apegaría a usar en
typeof foo === "undefined"
todas partes. Eso nunca puede salir mal.Me imagino que la razón por la cual jQuery recomienda los dos métodos diferentes es que definen su propia
undefined
variable dentro de la función en la que vive el código jQuery, por lo que dentro de esa funciónundefined
está a salvo de manipulaciones externas. También me imagino que alguien en algún lugar ha comparado los dos enfoques diferentes y descubierto quefoo === undefined
es más rápido y, por lo tanto, decidió que es el camino a seguir. [ACTUALIZACIÓN: como se señaló en los comentarios, la comparación conundefined
es también un poco más corta, lo que podría ser una consideración.] Sin embargo, la ganancia en situaciones prácticas será completamente insignificante: esta verificación nunca será un tipo de cuello de botella, y qué perder es importante: evaluar una propiedad de un objeto host para comparar puede arrojar un error mientras que untypeof
el cheque nunca lo hará.Por ejemplo, lo siguiente se usa en IE para analizar XML:
Para verificar si tiene un
loadXML
método de forma segura:Por otra parte:
ACTUALIZAR
Otra ventaja de la
typeof
verificación que olvidé mencionar es que también funciona con variables no declaradas, que lafoo === undefined
verificación no hace, y de hecho arroja unReferenceError
. Gracias a @LinusKleen por recordármelo. Por ejemplo:En pocas palabras: siempre use el
typeof
cheque.fuente
foo === undefined
, cuando se minimiza, es probablemente algo asíf===u
, mientrastypeof foo === "undefined"
que solo se puede reducir atypeof f==="undefined"
.var u = "undefined"
y reducirlo atypeof f==u
, lo que mejora las cosas pero aún es más grande.typeof
frente a variables no declaradas sea una ventaja. En todo caso, permite que los errores tipográficos pasen más fácilmente, y no puedo ver cuándo realmente querría verificar el tipo de variables no declaradas.Otra razón más para usar el tipo de variante:
undefined
se puede redefinir.El resultado de
typeof variable
no se puede.Actualización : tenga en cuenta que este no es el caso en ES5, donde el global
undefined
es una propiedad no configurable, no escribible:Pero aún puede ser sombreado por una variable local:
o parámetro:
fuente
undefined
propiedad global no se puede redefinir en ES5, pero aún se puede sombrear con una variable local.void 0
Es más corto y seguro.Porque
undefined
no siempre se declara, pero jQuery declaraundefined
en su función principal. Entonces usan elundefined
valor seguro internamente, pero afuera, usan eltypeof
estilo para estar seguros.fuente
Quien esté interesado en la ganancia de rendimiento
variable === undefined
, puede echar un vistazo aquí, pero parece ser solo una optimización de Chrome.fuente
Para las variables locales, verificar con
localVar === undefined
funcionará porque deben haberse definido en algún lugar dentro del alcance local o no se considerarán locales.Para las variables que no son locales y no están definidas en ninguna parte, la comprobación
someVar === undefined
arrojará una excepción: Error de referencia no capturado: j no está definidoAquí hay un código que aclarará lo que digo anteriormente. Por favor, preste atención a los comentarios en línea para mayor claridad .
Si llamamos al código anterior así:
El resultado sería este:
Si llamamos al código anterior como estos (con cualquier valor en realidad):
La salida será:
Cuando realiza la comprobación de esta manera:
typeof x === 'undefined'
esencialmente pregunta esto: compruebe si la variablex
existe (se ha definido) en algún lugar del código fuente. (más o menos). Si conoce C # o Java, este tipo de verificación nunca se realiza porque si no existe, no se compilará.<== Fiddle Me ==>
fuente
Resumen:
Cuando en el ámbito global realmente queremos devolver verdadero si la variable no se declara o tiene el valor
undefined
:Debido a que en el ámbito global no estamos 100% seguros de si se declara una variable, esto podría darnos un error de referencia. Cuando usamos el
typeof
operador en la variable desconocida, no tenemos este problema cuando la variable no se declara:Esto se debe al hecho de que el
typeof
operador devuelve la cadenaundefined
cuando una variable no se declara o actualmente contiene el valorundefined
que es exactamente lo que queremos.undefined
fuente
typeof a === 'undefined'
es más rápido quea === 'undefined'
aproximadamente 2 veces en el nodo v6.9.1.fuente
undefined
a la segunda parte, no'undefined'