As Diretrizes de estilo do jQuery Core sugerem duas maneiras diferentes de verificar se uma variável está definida.
- Variáveis globais:
typeof variable === "undefined"
- Variáveis locais:
variable === undefined
- Propriedades:
object.prop === undefined
Por que o jQuery usa uma abordagem para variáveis globais e outra para locais e propriedades?
javascript
jquery
undefined
Patrick McElhaney
fonte
fonte
foo === undefined
está verificando a cópia local de indefinido em vez do global (window.undefined), que pode ter sido modificado por código insano. O fato de que indefinido é mutável é definitivamente digno de nota e estou feliz que você tenha feito. (+1)Respostas:
Para variáveis não declaradas,
typeof foo
retornará a string literal"undefined"
, enquanto a verificação de identidadefoo === undefined
acionaria o erro "foo não está definido" .Para variáveis locais (que você sabe que estão declaradas em algum lugar), esse erro não ocorreria, portanto, a verificação de identidade.
fonte
typeof foo; // -> "undefined"
) para enfatizar que é uma string e não o valor primitivoundefined
.Eu continuaria usando em
typeof foo === "undefined"
todos os lugares. Isso nunca pode dar errado.Eu imagino que a razão pela qual o jQuery recomenda os dois métodos diferentes é que eles definem sua própria
undefined
variável dentro da função em que o código jQuery reside, portanto, dentro dessa função,undefined
é seguro evitar adulterações externas. Eu também imaginaria que alguém em algum lugar comparou as duas abordagens diferentes e descobriu quefoo === undefined
é mais rápido e, portanto, decidiu que é o caminho a seguir. [ATUALIZAÇÃO: como observado nos comentários, a comparação comundefined
também é um pouco mais curta, o que pode ser uma consideração.] No entanto, o ganho em situações práticas será totalmente insignificante: essa verificação nunca será algum tipo de gargalo e o que você perde é significativo: avaliar uma propriedade de um objeto host para comparação pode gerar um erro, enquanto umtypeof
cheque nunca será.Por exemplo, o seguinte é usado no IE para analisar XML:
Para verificar se ele possui um
loadXML
método com segurança:Por outro lado:
ATUALIZAR
Outra vantagem da
typeof
verificação que eu esqueci de mencionar foi que ela também trabalha com variáveis não declaradas, o que afoo === undefined
verificação não faz e, de fato, gera aReferenceError
. Obrigado a @LinusKleen por me lembrar. Por exemplo:Conclusão: sempre use o
typeof
cheque.fonte
foo === undefined
, quando minimizado, é provavelmente algo comof===u
, enquanto quetypeof foo === "undefined"
só pode ser reduzido paratypeof f==="undefined"
.var u = "undefined"
e reduzi-lo paratypeof f==u
, o que melhora as coisas, mas ainda é maior.typeof
contra variáveis não declaradas seja uma vantagem. Se alguma coisa permitir, erros de digitação passam mais facilmente, e não consigo ver quando você realmente deseja verificar o tipo de variáveis não declaradas.Ainda outro motivo para usar o tipo de variante:
undefined
pode ser redefinido.O resultado de
typeof variable
não pode.Atualização : observe que esse não é o caso no ES5, pois o global
undefined
é uma propriedade não configurável e não gravável:Mas ainda pode ser sombreado por uma variável local:
ou parâmetro:
fonte
undefined
propriedade global não pode ser redefinida no ES5, mas ainda pode ser sombreada com uma variável local.void 0
é mais curto e seguro.Porque
undefined
nem sempre é declarado, mas o jQuery declaraundefined
em sua função principal. Então, eles usam oundefined
valor seguro internamente, mas, fora, usam otypeof
estilo para serem seguros.fonte
Quem está interessado no ganho de desempenho de
variable === undefined
, pode dar uma olhada aqui, mas parece ser apenas uma otimização de cromo.fonte
Para variáveis locais, a verificação com
localVar === undefined
funcionará porque eles devem ter sido definidos em algum lugar no escopo local ou não serão considerados locais.Para variáveis que não são locais e não estão definidas em nenhum lugar, a verificação
someVar === undefined
lançará a exceção: Uncaught ReferenceError: j não está definidoAqui está um código que esclarecerá o que estou dizendo acima. Por favor, preste atenção aos comentários embutidos para maior clareza .
Se chamarmos o código acima, assim:
A saída seria esta:
Se chamarmos o código acima como este (com qualquer valor realmente):
A saída será:
Quando você faz a verificação como esta:,
typeof x === 'undefined'
você está essencialmente perguntando isto: Verifique se a variávelx
existe (foi definida) em algum lugar no código-fonte. (mais ou menos). Se você conhece C # ou Java, esse tipo de verificação nunca é feito porque, se não existir, não será compilado.<== Fiddle Me ==>
fonte
Resumo:
Quando no escopo global, na verdade, queremos retornar true se a variável não for declarada ou tiver o valor
undefined
:Como no escopo global, não temos 100% de certeza se uma variável é declarada, isso pode nos dar um referenceError. Quando usamos o
typeof
operador na variável desconhecida, não estamos obtendo esse problema quando a variável não é declarada:Isso se deve ao fato de o
typeof
operador retornar a stringundefined
quando uma variável não é declarada ou atualmente mantém o valorundefined
exatamente o que queremos.undefined
fonte
typeof a === 'undefined'
é mais rápido do quea === 'undefined'
em cerca de 2 vezes no nó v6.9.1.fonte
undefined
na segunda parte, não'undefined'