Uma alternativa para a infinidade de typeof
respostas;
Variáveis globais declaradas com uma var varname = value;
declaração no escopo global
pode ser acessado como propriedades do objeto window.
Como tal, o hasOwnProperty()
método, que
retorna um booleano indicando se o objeto tem a propriedade especificada como sua própria propriedade (em vez de herdá-lo)
pode ser usado para determinar se
um var
de "varname" foi declarado globalmente, isto é, uma propriedade do 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
] );
O que é ótimo hasOwnProperty()
é que, ao chamá-lo, não usamos uma variável que ainda não foi declarada - o que, obviamente, é metade do problema.
Embora nem sempre seja a solução perfeita ou ideal , em certas circunstâncias, é apenas o trabalho!
Notas
O exposto acima é verdadeiro ao usar var
para definir uma variável , ao contrário da let
qual:
declara uma variável local do escopo do bloco, inicializando-a opcionalmente como um valor.
é diferente da var
palavra - chave, que define uma variável globalmente ou localmente para uma função inteira, independentemente do escopo do bloco.
No nível superior de programas e funções, let
ao contrário var
, não cria uma propriedade no objeto global.
Para completude: const
constantes, por definição, não são realmente variáveis (embora seu conteúdo possa ser); mais relevante:
As constantes globais não se tornam propriedades do objeto window, diferentemente das var
variáveis. É necessário um inicializador para uma constante; isto é, você deve especificar seu valor na mesma instrução em que é declarado.
O valor de uma constante não pode mudar através da reatribuição e não pode ser redeclarado.
A declaração const cria uma referência somente leitura para um valor. Isso não significa que o valor que ele possui seja imutável, apenas que o identificador da variável não pode ser reatribuído.
Como let
variáveis ou const
constantes nunca são propriedades de nenhum objeto que herdou o hasOwnProperty()
método, ele não pode ser usado para verificar sua existência.
Em relação à disponibilidade e uso de hasOwnProperty()
:
Todo objeto descendente de Object herda o hasOwnProperty()
método. [...] diferentemente do in
operador, esse método não verifica a cadeia de protótipos do objeto.
foo
está declarado,typeof foo === 'undefined'
outypeof foo === typeof undefined