Qual método de verificação se uma variável foi inicializada é melhor / correto? (Supondo que a variável possa conter qualquer coisa (string, int, objeto, função etc.))
if (elem) { // or !elem
ou
if (typeof(elem) !== 'undefined') {
ou
if (elem != null) {
javascript
variables
initialization
undefined
Samuel Liew
fonte
fonte
foo
está declarado,typeof foo === 'undefined'
outypeof foo === typeof undefined
undefined
. A resposta correta é esta: stackoverflow.com/a/36432729/772035hasOwnProperty('bar')
não tem as mesmas deficiências que as outras, mas exigiria algum ajuste para o Node (substituawindow
porglobal
).Respostas:
Você quer o
typeof
operador . Especificamente:fonte
O
typeof
operador verificará se a variável está realmente indefinida.O
typeof
operador, diferentemente dos outros operadores, não lança uma exceção ReferenceError quando usado com uma variável não declarada.No entanto, observe que
typeof null
retornará"object"
. Temos que ter cuidado para evitar o erro de inicializar uma variável paranull
. Para estar seguro, é isso que poderíamos usar:Para obter mais informações sobre o uso de comparação estrita em
===
vez de igualdade simples==
, consulte:Qual operador igual (== vs ===) deve ser usado nas comparações de JavaScript?
fonte
if(! variable_here)
irá quebrar em muitos casos. Se a variável for 0 ou falsa, ela falhará. Não é isso que você quer.typeof foo === "undefined"
, a resposta está correta e melhor que a resposta mais votada, mas as notas adicionais apenas tornam essa resposta confusa.Em muitos casos, usando:
fará o trabalho para você! ... isso verificará os seguintes casos:
undefined
''
Portanto, ele cobre todos os casos, mas sempre há casos estranhos que gostaríamos de cobrir, por exemplo, uma string com espaços, como este
' '
, que será definida em javascript, pois possui espaços dentro da string ... por exemplo, neste caso, você adiciona mais uma verificação usando trim (), como:Além disso, essas verificações são apenas para valores , pois objetos e matrizes funcionam de maneira diferente em Javascript, matriz
[]
vazia e objeto vazio{}
sempre são verdadeiros .Crio a imagem abaixo para mostrar um breve resumo da resposta:
fonte
if(elem)
verifica indefinidamente (enquanto retorna erro não definido), não é?Em JavaScript, uma variável pode ser definida, mas mantenha o valor
undefined
, para que a resposta mais comum não seja tecnicamente correta e, em vez disso, execute o seguinte:Isso pode ser suficiente para seus propósitos. O teste a seguir possui semântica mais simples, o que facilita a descrição precisa do comportamento do seu código e a sua compreensão (se você se importa com essas coisas):
Obviamente, isso pressupõe que você esteja executando em um navegador (onde
window
é um nome para o objeto global). Mas se você está mexendo com globals como esse, provavelmente está em um navegador. Subjetivamente, o uso'name' in window
é estilisticamente consistente com o usowindow.name
para se referir a globais. O acesso a globais como propriedades dewindow
e não como variáveis permite minimizar o número de variáveis não declaradas que você faz referência em seu código (para o benefício de aprender a usar fiapos) e evita a possibilidade de sua global ser sombreada por uma variável local. Além disso, se os globais fizerem a pele arrepiar, você poderá se sentir mais confortável tocando-os apenas com esse bastão relativamente longo.fonte
Na maioria dos casos, você usaria:
Ao contrário de um simples
if (elem)
, permite0
,false
,NaN
e''
, mas rejeitanull
ouundefined
, tornando-se uma boa, teste geral para a presença de um argumento, ou propriedade de um objeto.As outras verificações também não estão incorretas, apenas têm usos diferentes:
if (elem)
: Pode ser utilizado seelem
é garantida para ser um objecto, ou sefalse
,0
, etc, são considerados como valores "padrão" (portanto, equivalente aundefined
ounull
).typeof elem == 'undefined'
pode ser usado nos casos em que um especificadonull
tem um significado distinto para uma variável ou propriedade não inicializada.elem
não for declarada (ou seja, nenhumavar
declaração, nem uma propriedade dewindow
, nem um argumento de função). Isso é, na minha opinião, bastante perigoso, pois permite que erros de digitação passem despercebidos. Para evitar isso, consulte o método abaixo.Também é útil uma comparação estrita contra
undefined
:No entanto, como o global
undefined
pode ser substituído por outro valor, é melhor declarar a variávelundefined
no escopo atual antes de usá-lo:Ou:
Uma vantagem secundária desse método é que os minificadores JS podem reduzir a
undefined
variável para um único caractere, economizando alguns bytes a cada vez.fonte
undefined
. Eu nem acho que vale a pena mencionar na resposta. Provavelmente, o pior nome de variável aceitável em todo o Javascript.window.
antes da variável, se usada no contexto global ... essa não é a melhor maneira.void(0)
vez deundefined
.false
,0
etc., como valores inválidos.Verifique se
window
.hasOwnProperty
( "varname
" )Uma alternativa para a infinidade de
typeof
respostas;Variáveis globais declaradas com uma
var varname = value;
declaração no escopo globalComo tal, o
hasOwnProperty()
método, queum
var
de "varname" foi declarado globalmente, isto é, uma propriedade dowindow
.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 dalet
qual:Para completude:
const
constantes, por definição, não são realmente variáveis (embora seu conteúdo possa ser); mais relevante:Como
let
variáveis ouconst
constantes nunca são propriedades de nenhum objeto que herdou ohasOwnProperty()
método, ele não pode ser usado para verificar sua existência.Em relação à disponibilidade e uso de
hasOwnProperty()
:fonte
true
(por exemplo,window.hasOwnProperty('console')
ouvar hop = "p";window.hasOwnProperty('hop')
).typeof
respostas simplesmente ignoram.let
quais essas variáveis não estão disponíveis como propriedades dowindow
objeto [ou qualquer outro objeto disponível].hasOwnProperty
testes para presença de propriedades , não variáveis e, portanto, não podem ser usados para detectar variáveis definidas porlet
.var
e, nesse sentido, não está desatualizada. No entanto, adicionei uma nota descrevendo como o uso delet
econst
difere do devar
. Obrigado pela sua inspiração; juntos vamos subir :)hasOwnProperty
só pode ser usado da maneira prescrita para verificar a existência devar
variáveis. Está tudo bem para mim.Como verificar se existe uma variável
Esta é uma solução bastante à prova de balas para testar se uma variável existe e foi inicializada:
É mais comumente usado em combinação com um operador ternário para definir um padrão, caso uma determinada variável não tenha sido inicializada:
Problemas com o encapsulamento
Infelizmente, você não pode simplesmente encapsular seu cheque em uma função.
Você pode pensar em fazer algo assim:
No entanto, isso produzirá um erro de referência se você estiver ligando, por exemplo.
isset(foo)
e variávelfoo
não foi definida, porque você não pode passar uma variável inexistente para uma função:Testando se os parâmetros de função são indefinidos
Embora nossa
isset
função não possa ser usada para testar se uma variável existe ou não (por razões explicadas acima), ela nos permite testar se os parâmetros de uma função são indefinidos:Embora nenhum valor para
y
seja repassado para a funçãotest
, nossaisset
função funciona perfeitamente nesse contexto, porquey
é conhecida na funçãotest
como umundefined
valor.fonte
Existe outra maneira curta de verificar isso, quando você executa tarefas simples e verificações relacionadas. Basta usar o operador condicional (ternário).
Além disso, isso será útil quando você tentar declarar a variável Global com a atribuição de instância da variável de referência.
Se você quisesse verificar a variável não deveria ser
undefined
ounull
. Em seguida, execute a verificação abaixo.Quando a variável é declarada, e se você deseja verificar o valor, isso é até Simples: e seria executado
undefined
enull
verificado juntos.fonte
typeof(booooo)
é"undefined"
entãotypeof(typeof boooooo)
é"string"
etypeof boooooo && true
é sempretrue
. A resposta de John-Slegers é a mais abreviada possível com o typeof.If you wanted to check variable shouldn't be undefined or null.
. Por esse comentário, é claramente indicado, não é necessário executar a verificação da declaração da variável. isso é para verificar o valor da variável.A maneira curta de testar uma variável não é declarada (não indefinida) é
Eu achei útil para detectar scripts em execução fora de um navegador (não tendo declarado
window
variável).fonte
window.bar=undefined
é definido e definido como um valor. Sua resposta falha ao detectar a diferença entre isso e se a variável não existe. Se você fezthis.hasOwnProperty('bar')
isso pode ter funcionado.const x = 0; (() => console.log(x, this.hasOwnProperty('x')))();
. A variávelx
é definida, mas falso é retornado ...Depende se você apenas se importa que a variável tenha sido definida ou se deseja que ela tenha um valor significativo.
Verificar se o tipo está indefinido verificará se a variável já foi definida.
=== null
ou!== null
verificará apenas se o valor da variável é exatamentenull
.== null
ou!= null
irá verificar se o valor éundefined
ounull
.if(value)
irá verificar se a variável éundefined
,null
,0
, ou uma string vazia.fonte
A resposta mais alta está correta, use typeof.
No entanto, o que eu queria ressaltar era que no JavaScript
undefined
é mutável (por algum motivo ímpio). Portanto, simplesmente fazer uma verificação paravarName !== undefined
tem o potencial de nem sempre retornar como você espera, porque outras bibliotecas podem ter mudado indefinidamente. Algumas respostas (@ skalee's, por exemplo) parecem preferir não usartypeof
, e isso pode causar problemas.A maneira "antiga" de lidar com isso foi declarar indefinida como uma var para compensar qualquer possível bloqueio / substituição
undefined
. No entanto, a melhor maneira ainda é usar,typeof
porque ignorará qualquer substituição deundefined
outro código. Especialmente se você estiver escrevendo um código para uso na natureza, onde quem sabe o que mais poderia estar em execução na página ...fonte
varName !== undefined
causará apenas um ReferenceError. A mutabilidade deundefined
não importa.undefined
é uma propriedade somente leitura. No entanto, para ser à prova de balas, você pode usartypeof mvVar === typeof void 0
.void 0
retornaundefined
sempre.Ou melhor
Funciona em todos os navegadores
fonte
Para contribuir com o debate, se eu sei que a variável deve ser uma string ou um objeto que eu sempre prefiro
if (!variable)
, verifique se é falso. Isso pode levar a um código mais limpo, de modo que, por exemplo:..pode ser reduzido para:
fonte
''
sua solução, a considerará indefinida, quando na verdade é definida como contendo uma sequência vazia.É difícil distinguir entre indefinido e nulo. Nulo é um valor que você pode atribuir a uma variável quando desejar indicar que a variável não possui um valor específico. Indefinido é um valor especial que será o valor padrão de variáveis não atribuídas.
fonte
Nulo é um valor em JavaScript e
typeof null
retorna"object"
Portanto, a resposta aceita não funcionará se você passar valores nulos. Se você passar valores nulos, precisará adicionar uma verificação extra para valores nulos:
fonte
A verificação mais robusta 'está definida' é com typeof
Se você está apenas verificando uma variável definida para atribuir um padrão, para um liner de fácil leitura, é possível fazer isso:
Geralmente é bom usar, veja: Maneira linguística de definir o valor padrão em javascript
Há também este liner usando a palavra-chave typeof :
fonte
você pode usar o
typeof
operador.Por exemplo,
O trecho de código acima retornará a saída como
fonte
Para verificar se uma variável foi declarada / definida, fiz esse truque sujo.
Eu não encontrei uma maneira de extrair o código para uma função, mesmo com
eval
.fonte
Essas respostas (além da solução de Fred Gandt) são todas incorretas ou incompletas.
Suponha que eu precise que eu
variableName;
carregue umundefined
valor e, portanto, ele foi declarado de uma maneiravar variableName;
que significa que já foi inicializado ; - Como verifico se já está declarado?Ou melhor ainda - como verifico imediatamente se "Book1.chapter22.paragraph37" existe com uma única chamada, mas não gera um erro de referência?
Fazemos isso usando o operador JasvaScript mais poderoso, o operador in . :
Em tempos de grande popularidade do AJAX, escrevi um método (mais tarde denominado) isNS () que é capaz de determinar se o espaço para nome existe, incluindo testes profundos para nomes de propriedades como "Book1.chapter22.paragraph37" e muito mais.
Mas, como ele foi publicado anteriormente e, devido à sua grande importância, merece ser publicado em um tópico separado, não o publicarei aqui, mas fornecerá palavras-chave ( javascript + isNS ) que ajudarão a localizar o código-fonte, com todos os recursos explicações necessárias.
fonte
in
operador testa apenas a existência de propriedades, e nem todas as variáveis são propriedades -const
e aslet
declarações não são (econst
nem são, bem, variáveis ).const
elet
foram padronizados com o ECMAScript 2015, que foi publicado há mais de 3 anos e desde então tem sido adotado pelos suspeitos de sempre e é usado de maneira difundida hoje, ouso dizer - há mais de 2 milhões de ocorrências de "const" no Github em arquivos JS .in
operador para geralmente testar se existe uma variável , porque "const e let não são [propriedades]" - embora, deconst
fato, possa-se dizer que introduz uma referência constante , como ao contrário de uma referência de variávellet
, por outro lado, na verdade introduz uma referência de variável - é, em outras palavras, por qualquer medida, uma variável e sua resposta está incorreta ao sugerir que você pode testar se uma variável definida comlet
existe usando oin
operador - você não pode.window
objeto, não sei como deixar isso mais claro para você.let
palavra - chave. Era tudo o que eu estava apontando.Na situação específica descrita na pergunta,
é idêntico a
Eu prefiro o último, pois é mais curto.
Observe que procuramos
console
apenas no escopo global (que é umwindow
objeto em todos os navegadores). Nesta situação em particular, é desejável. Nós não queremosconsole
definidos em outro lugar.@BrianKelley em sua ótima resposta explica detalhes técnicos. Eu apenas adicionei a falta de conclusão e a digeri em algo mais fácil de ler.
fonte
Eu uso duas maneiras diferentes, dependendo do objeto.
Às vezes, não quero avaliar uma string vazia como falsey, então uso esse caso
Se você precisar do contrário, na primeira instância, a variável! Torna-se variável !!, e na função inválida === torna-se! = E os nomes das funções mudam para notInvalid.
fonte
Minha preferência é
typeof(elem) != 'undefined' && elem != null
.Como você escolher, considere colocar o cheque em uma função como essa
Se você não sabe que a variável está declarada, continue com
typeof (x) != 'undefined' && x != null;
Onde você sabe que a variável está declarada, mas pode não existir, você pode usar
A variável que você está verificando pode ser uma propriedade aninhada às vezes. Você pode usar prop || {} para descer a linha verificando a existência da propriedade em questão:
Após cada propriedade, use (... '|| {}'). NextProp para que uma propriedade ausente não gere um erro.
Ou você pode usar existy como
existy(o) && existy(o.p) && existy(o.p.q) && doSomething(o.p.q)
fonte
typeof (x) != 'undefined' && x != null
é equivalente ax != null
quandox
é declarado.Depende da situação. Se você está procurando algo que pode ou não ter sido definido globalmente fora do seu código (como o jQuery, talvez), você deseja:
(Não há necessidade de igualdade estrita lá, typeof sempre retorna uma string.) Mas se você tiver argumentos para uma função que pode ou não ter sido passada, eles sempre serão definidos, mas nulos se omitidos.
fonte
Try-catch
Se a variável não foi definida, você pode verificar isso sem a execução do código de interrupção usando o bloco try-catch da seguinte maneira (você não precisa usar o
use strict
modo)Mostrar snippet de código
BÔNUS: (referindo-se a outras respostas) Por que
===
é mais claro que==
( fonte )se (a == b)
se (a === b)
fonte
Estou surpreso que isso ainda não tenha sido mencionado ...
Aqui estão algumas variações adicionais usando
this['var_name']
o benefício de usar esse método que ele pode ser usado antes que uma variável seja definida.
fonte
window.bar=undefined
é definido e definido como um valor. Sua resposta falha ao detectar a diferença entre isso e se a variável não existe. Se você fezthis.hasOwnProperty('bar')
isso pode ter funcionado.Você pode usar um bloco try ... catch como a seguir:
Mostrar snippet de código
Uma desvantagem é que você não pode colocá-lo em uma função, pois geraria um ReferenceError
fonte