Альтернатива множеству typeof
ответов;
Глобальные переменные, объявленные с помощью оператора var varname = value;
в глобальной области действия
можно получить как свойства объекта окна.
Как таковой, метод hasOwnProperty()
, который
возвращает логическое значение, указывающее, имеет ли объект указанное свойство как собственное свойство (в отличие от его наследования)
может использоваться для определения того,
a var
из "varname" объявлено глобально , т.е. является свойством 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()
:
Каждый объект, произошедший от Объект наследует метод hasOwnProperty()
. [...] в отличие от оператора in
, этот метод не проверяет цепочку прототипов объекта.