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 === undefinedse 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 foodevolverá el literal de cadena"undefined", mientras que la verificación de identidadfoo === undefinedactivarí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
undefinedvariable dentro de la función en la que vive el código jQuery, por lo que dentro de esa funciónundefinedestá a salvo de manipulaciones externas. También me imagino que alguien en algún lugar ha comparado los dos enfoques diferentes y descubierto quefoo === undefinedes 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 conundefinedes 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 untypeofel cheque nunca lo hará.Por ejemplo, lo siguiente se usa en IE para analizar XML:
Para verificar si tiene un
loadXMLmétodo de forma segura:Por otra parte:
ACTUALIZAR
Otra ventaja de la
typeofverificación que olvidé mencionar es que también funciona con variables no declaradas, que lafoo === undefinedverificación no hace, y de hecho arroja unReferenceError. Gracias a @LinusKleen por recordármelo. Por ejemplo:En pocas palabras: siempre use el
typeofcheque.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.typeoffrente 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:
undefinedse puede redefinir.El resultado de
typeof variableno se puede.Actualización : tenga en cuenta que este no es el caso en ES5, donde el global
undefinedes una propiedad no configurable, no escribible:Pero aún puede ser sombreado por una variable local:
o parámetro:
fuente
undefinedpropiedad global no se puede redefinir en ES5, pero aún se puede sombrear con una variable local.void 0Es más corto y seguro.Porque
undefinedno siempre se declara, pero jQuery declaraundefineden su función principal. Entonces usan elundefinedvalor seguro internamente, pero afuera, usan eltypeofestilo 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 === undefinedfuncionará 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 === undefinedarrojará 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 variablexexiste (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
typeofoperador en la variable desconocida, no tenemos este problema cuando la variable no se declara:Esto se debe al hecho de que el
typeofoperador devuelve la cadenaundefinedcuando una variable no se declara o actualmente contiene el valorundefinedque es exactamente lo que queremos.undefinedfuente
typeof a === 'undefined'es más rápido quea === 'undefined'aproximadamente 2 veces en el nodo v6.9.1.fuente
undefineda la segunda parte, no'undefined'