Una alternativa a la gran cantidad de typeof
respuestas;
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 var
de "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 var
para definir una variable , en oposición a la let
cual:
declara una variable local de ámbito de bloque, opcionalmente inicializándola en un valor.
es diferente a la var
palabra 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 let
diferencia 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 var
variables. 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 let
variables o const
constantes 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 in
operador, este método no verifica la cadena prototipo del objeto.
foo
se declara,typeof foo === 'undefined'
o bientypeof foo === typeof undefined