Encontrei o seguinte código:
function test(data) {
if (data != null && data !== undefined) {
// some code here
}
}
Sou um pouco novo em JavaScript, mas, a partir de outras perguntas que tenho lido aqui, tenho a impressão de que esse código não faz muito sentido.
Você receberá um erro se acessar uma variável indefinida em qualquer contexto que não sejatypeof
.
Atualização: a (citação da) resposta acima pode ser enganosa. Deve dizer «uma variável não declarada» , em vez de «uma variável não definida» .
Como descobri, nas respostas de Ryan ♦ , maerics e nwellnhof , mesmo quando nenhum argumento é fornecido para uma função, suas variáveis para os argumentos sempre são declaradas. Esse fato também prova errado o primeiro item da lista abaixo.
Pelo meu entendimento, os seguintes cenários podem ser observados:
A função foi chamada sem argumentos, criando assimdata
uma variável indefinida e gerando um errodata != null
.A função foi chamada especificamente com
null
(ouundefined
), como argumento, caso em quedata != null
já protege o código interno, tornando-o&& data !== undefined
inútil.A função foi chamada com um argumento não nulo; nesse caso, passará trivialmente ambos
data != null
edata !== undefined
.
P: Meu entendimento está correto?
Eu tentei o seguinte, no console do Firefox:
--
[15:31:31.057] false != null
[15:31:31.061] true
--
[15:31:37.985] false !== undefined
[15:31:37.989] true
--
[15:32:59.934] null != null
[15:32:59.937] false
--
[15:33:05.221] undefined != null
[15:33:05.225] false
--
[15:35:12.231] "" != null
[15:35:12.235] true
--
[15:35:19.214] "" !== undefined
[15:35:19.218] true
Não consigo descobrir um caso em que o data !== undefined
depois data != null
possa ser útil.
fonte
if (data)
. É uma maneira mnemônica de Javascript para verificar se adata
variável é avaliada como verdadeira.undefined
,null
, Falso, 0, cadeia vazia, matriz vazia e objecto (?) Sem propriedades avaliada como falsa, o resto é verdadeiro.if(data)
significaria que ele não pode passarfalse
ou0
como valoresdata
.if(typeof someUndefVar == whatever) -- works
eif(someUnderVar) -- error
.data !== null && data !== undefined
, o que é equivalente aodata != null
que é equivalentedata != undefined
. A forma anterior tende a ser favorecida, pois é mais explícita sobre as condições, ao passo que seria fácil ignorar essas duasnull
eundefined
está sendo verificada com as duas condições posteriores.undefined
IMO são um cheiro de código. Não é uma palavra-chave protegidanull
, é uma variável indefinida. Isto é completamente válida e vai quebrar seu código:undefined = 1
Respostas:
Uma "variável indefinida" é diferente do valor
undefined
.Uma variável indefinida:
Uma variável com o valor
undefined
:Quando uma função usa um argumento, esse argumento é sempre declarado, mesmo que seu valor seja
undefined
e, portanto, não haverá nenhum erro. Você está certo sobre!= null
seguido de!== undefined
ser inútil, no entanto.fonte
data !== null && data !== undefined
faria sentido, no entanto.data != null
verificaria ambosnull
eundefined
(mas, curiosamente, apenas paranull
eundefined
, e não os outros valores falsos).Em JavaScript,
null
é um objeto singleton especial que é útil para sinalizar "sem valor". Você pode testá-lo por comparação e, como de costume no JavaScript, é uma boa prática usar o===
operador para evitar confusão de tipo de coerção:Como @rynah menciona, "indefinido" é um pouco confuso em JavaScript. No entanto, é sempre seguro testar se a
typeof(x)
string é "indefinida", mesmo que "x" não seja uma variável declarada:Além disso, as variáveis podem ter o "valor indefinido" se não forem inicializadas:
Juntando tudo, seu cheque deve ficar assim:
No entanto, como a variável "data" é sempre definida, pois é um parâmetro de função formal, o uso do operador "typeof" é desnecessário e você pode comparar com segurança diretamente com o "valor indefinido".
Este trecho equivale a dizer "se a função foi chamada com um argumento definido e não é nulo ..."
fonte
!= null
será verdadeiro para todos os valores, excetonull
eundefined
, e temos certeza de que essa variável é declarada.typeof
em outras situações, pode até ser perigoso - e se você digitar incorretamente o nome da variável? Isso pode ser detectado por um longo tempo, porque não há erro.!=
nada, apenas uma comparação estrita!==
?===
), a menos que você realmente saiba o que está fazendo e queira comparar após a conversão (==
).undefined
. Além disso, o Safari no iPad fará isso em nenhuma circunstância. Você não pode nemdelete window.undefined
.No seu caso, use
data==null
(que é verdadeiro APENAS para nulo e indefinido - na segunda imagem, concentre-se em linhas / colunas nulo indefinido)Mostrar snippet de código
Aqui você tem todos ( src ):
E se
== (sua negação ! = )
=== (sua negação ! == )
fonte
P: A função foi chamada sem argumentos, tornando os dados uma variável indefinida e gerando um erro nos dados! = Null.
R: Sim,
data
será definido como indefinido. Consulte a seção 10.5 Instanciação de encadernação da declaração das especificações. Mas acessar um valor indefinido não gera um erro. Você provavelmente está confundindo isso com o acesso a uma variável não declarada no modo estrito, o que gera um erro.P: A função foi chamada especificamente com null (ou indefinido), como argumento. Nesse caso, data! = Null já protege o código interno, tornando inútil && data! == indefinido.
P: A função foi chamada com um argumento não nulo; nesse caso, passará trivialmente os dados! = Null e data! == indefinidos.
A: correto. Observe que os seguintes testes são equivalentes:
Consulte a seção 11.9.3 O algoritmo de comparação de igualdade de igualdade e a seção 11.9.6 O algoritmo de comparação de igualdade estrita da especificação.
fonte
data
isso não existiria, em vez de ser definidoundefined
. Agradeço o esclarecimento, e essas referências me ajudaram a entender com mais detalhes como as duas igualdades funcionam.Eu acho que testar variáveis para valores que você não espera não é uma boa ideia em geral. Porque o teste como você pode considerar como escrever uma lista negra de valores proibidos. Mas e se você esquecer de listar todos os valores proibidos? Alguém, até você, pode decifrar seu código transmitindo um valor inesperado. Portanto, uma abordagem mais apropriada é semelhante à lista de permissões - testando variáveis apenas para os valores esperados, não inesperados. Por exemplo, se você espera que o valor dos dados seja uma sequência, em vez disso:
faça algo assim:
fonte
typeof foo === "undefined"
é diferente defoo === undefined
, nunca os confunda.typeof foo === "undefined"
é o que você realmente precisa. Além disso, use!==
no lugar de!=
Portanto, a declaração pode ser escrita como
Editar:
Você não pode usar
foo === undefined
para variáveis não declaradas.fonte
foo === undefined
perigoso usar. Isso faz com que seu código falhe na mesma condição que você estava tentando impedir.foo === undefined
é perfeitamente aceitável na situação do OP (supondoundefined
que não tenha sido substituído). A resposta também falha em explicar por que!==
deve ser usado no lugar de!=
.A maneira simples de fazer seu teste é:
fonte
data
for uma string, esse teste retornará false em strings vazias, o que pode ou não ser apropriado (a função pode querer lidar com a string vazia de alguma forma).""
ou0
ouNaN
(ou outros), o bloco "se" será ignorado; que pode ou não ser a intenção do OP.fonte
null
.