Альтернатива множеству 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