Альтернатива множеству typeofответов;
Глобальные переменные объявлены с var varname = value;оператором в глобальной области видимости
могут быть доступны как свойства объекта окна.
Как таковой, hasOwnProperty()метод, который
возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное свойство (в отличие от его наследования)
можно использовать для определения
varиз «» перем объявлена глобально т.е. является собственностью 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
] );
Самое замечательное в hasOwnProperty()том, что при его вызове мы не используем переменную, которая пока еще не может быть объявлена, что, конечно же, составляет половину проблемы.
Хотя это и не всегда в совершенен или идеального решения, при определенных обстоятельствах, это просто работа!
Ноты
Вышесказанное верно при использовании varдля определения переменной , в отличие от letкоторой:
объявляет локальную переменную области видимости блока, необязательно инициализируя ее значением.
отличается от varключевого слова, которое определяет переменную глобально или локально для всей функции независимо от области видимости блока.
На верхнем уровне программ и функций, в letотличие var, не создается свойство глобального объекта.
Для полноты: const константы по определению не являются на самом деле переменными (хотя их содержание может быть); более актуально:
Глобальные константы не становятся свойствами объекта окна, в отличие от varпеременных. Требуется инициализатор для константы; то есть вы должны указать его значение в том же операторе, в котором он объявлен.
Значение константы не может быть изменено путем переназначения, и оно не может быть повторно объявлено.
Объявление const создает доступную только для чтения ссылку на значение. Это не означает, что значение, которое оно содержит, является неизменным, просто то, что идентификатор переменной не может быть переназначен.
Поскольку letпеременные или constконстанты никогда не являются свойствами какого-либо объекта, унаследовавшего hasOwnProperty()метод, его нельзя использовать для проверки их существования.
Относительно наличия и использования hasOwnProperty():
Каждый объект, произошедший от Object, наследует hasOwnProperty()метод. [...] в отличие от inоператора, этот метод не проверяет цепочку прототипов объекта.
fooобъявлено, либоtypeof foo === 'undefined'илиtypeof foo === typeof undefined