Una alternativa a la gran cantidad de typeofrespuestas;
Variables globales declaradas con una var varname = value;declaración en el alcance global
Se puede acceder como propiedades del objeto de ventana.
Como tal, el hasOwnProperty()método, que
devuelve un valor booleano que indica si el objeto tiene la propiedad especificada como su propia propiedad (en lugar de heredarla)
puede usarse para determinar si
a varde "varname" ha sido declarado globalmente, es decir, es una propiedad de window.
// Globally established, therefore, properties of window
var foo = "whatever", // string
bar = false, // bool
baz; // undefined
// window.qux does not exist
console.log( [
window.hasOwnProperty( "foo" ), // true
window.hasOwnProperty( "bar" ), // true
window.hasOwnProperty( "baz" ), // true
window.hasOwnProperty( "qux" ) // false
] );
Lo bueno de esto hasOwnProperty()es que al llamarlo, no usamos una variable que aún no esté declarada, lo que, por supuesto, es la mitad del problema en primer lugar.
Aunque no siempre es la solución perfecta o ideal , en ciertas circunstancias, ¡es solo el trabajo!
Notas
Lo anterior es cierto cuando se usa varpara definir una variable , en oposición a la letcual:
declara una variable local de ámbito de bloque, opcionalmente inicializándola en un valor.
es diferente a la varpalabra clave, que define una variable globalmente o localmente para una función completa, independientemente del alcance del bloque.
En el nivel superior de programas y funciones, a letdiferencia de esto var, no crea una propiedad en el objeto global.
Para completar: las const constantes, por definición, no son realmente variables (aunque su contenido puede serlo); más relevante:
Las constantes globales no se convierten en propiedades del objeto de ventana, a diferencia de las varvariables. Se requiere un inicializador para una constante; es decir, debe especificar su valor en la misma declaración en la que se declara.
El valor de una constante no puede cambiar mediante la reasignación, y no se puede volver a declarar.
La declaración const crea una referencia de solo lectura a un valor. No significa que el valor que posee es inmutable, solo que el identificador de variable no se puede reasignar.
Dado que las letvariables o constconstantes nunca son propiedades de ningún objeto que haya heredado el hasOwnProperty()método, no se puede usar para verificar su existencia.
En cuanto a la disponibilidad y uso de hasOwnProperty():
Cada objeto que desciende de Object hereda el hasOwnProperty()método. [...] a diferencia del inoperador, este método no verifica la cadena prototipo del objeto.
foose declara,typeof foo === 'undefined'o bientypeof foo === typeof undefined