Muitas vezes vejo código JavaScript que verifica parâmetros indefinidos, etc., desta maneira:
if (typeof input !== "undefined") {
// do stuff
}
Isso parece meio desperdício, pois envolve uma pesquisa de tipo e uma comparação de cadeias, sem mencionar sua verbosidade. É necessário porque undefined
pode ser renomeado, no entanto.
Minha pergunta é:
como esse código é melhor do que essa abordagem:
if (null != input) {
// do stuff
}
Tanto quanto eu sei, você não pode redefinir null
, então não vai quebrar inesperadamente. E, devido à coerção de tipo do !=
operador, isso verifica os dois undefined
e null
... o que geralmente é exatamente o que você deseja (por exemplo, parâmetros de função opcionais).
No entanto, esse formulário não parece generalizado e até faz com que o JSLint grite com você por usar o !=
operador incorreto .
Por que isso é considerado um estilo ruim?
fonte
if (null != input)
é apenas "Yoda Speak" para o falante de inglês (de um eu sou .... uuammmmm), portanto, se eles equivalem à mesma coisa, é realmente apenas semântica. NA MINHA HUMILDE OPINIÃO.Respostas:
typeof
é mais seguro, pois permite que o identificador nunca tenha sido declarado antes:fonte
==
pode ser melhor, porque ele testa nulos e indefinidos.!==
ou===
ao comparar um valor cujo tipo é conhecido por ser uma string.Se a variável for declarada (com a
var
palavra - chave, como argumento de função ou como variável global), acho que a melhor maneira de fazer isso é:jQuery faz isso, então é bom o suficiente para mim :-)
Caso contrário, você precisará usar
typeof
para evitar aReferenceError
.Se você espera que o indefinido seja redefinido, você pode agrupar seu código assim:
Ou obtenha-o através do
void
operador:fonte
undefined
é o nome dado ao parâmetro da função, não o seu valor. Nada é passado para a função, significando que o valor do primeiro parâmetro é indefinido.bom caminho:
Mas a melhor maneira é verificar através de:
fonte
if (typeof neverDeclared === typeof undefined) {
mas o Lint gera um erro. "Esperava uma string e viu 'typeof'." Como você contornaria esse erro? Devemos nos submeter às demandas de Lint e usar o 'bom caminho'?typeof neverDeclared === typeof void 0
;-Dif(typeof neverDeclared === typeof undefined_variable_with_a_name_assumed_to_be_never_defined) {
mas é bastante longo.Você realmente não deve se preocupar em renomear o indefinido. Se alguém renomear indefinido, você terá muito mais problemas do que apenas alguns se as verificações falharem. Se você realmente deseja proteger seu código, envolva-o em uma IFFE (expressão de função imediatamente chamada) assim:
Se você estiver trabalhando com variáveis globais (que já estão erradas) em um ambiente de navegador, verifiquei indefinidamente assim:
Como as variáveis globais fazem parte do objeto de janela, você pode simplesmente verificar o indefinido em vez de converter em uma string e comparar as strings.
Além disso, por que suas variáveis não estão definidas? Eu já vi muitos códigos em que eles verificam a existência de variáveis e executam alguma ação com base nisso. Nem uma vez vi onde essa abordagem estava correta.
fonte
Se você está realmente preocupado com a redefinição indefinida, pode se proteger contra isso com algum método auxiliar como este:
Isso funciona porque quando alguém escreve,
undefined = "foo"
ele apenas permite que o nomeundefined
faça referência a um novo valor, mas ele não altera o valor real deundefined
.fonte
undefined_check
na parte superior e apenas usá-la em qualquer lugar do seu código.typeof
verificação.Você também pode usar o operador void para obter um valor indefinido:
(E sim, como observado em outra resposta, isso gerará um erro se a variável não tiver sido declarada, mas esse caso pode ser descartado com freqüência por inspeção de código ou refatoração de código, por exemplo, usando
window.input !== void 0
para testar variáveis globais ou adicionarvar input
.)fonte
Na verdade, me deparei se
(typeof input !== 'undefined')
neste cenário em que ele está sendo usado para fornecer parâmetros de função padrão:O ES6 fornece novas maneiras de introduzir parâmetros de função padrão desta maneira:
Isso é menos detalhado e mais limpo que a primeira opção.
fonte
fonte
fonte
fonte
funciona muito bem. Obviamente, não é uma
null
comparação, mas geralmente acho que, se preciso distinguir entreundefined
enull
, na verdade, preciso distinguir entreundefined
e qualquer valor falso, entãofaz isso.
Se um programa redefine,
undefined
ele é realmente muito interessante.A única razão pela qual consigo pensar foi na compatibilidade com o IE4, ela não entendeu a
undefined
palavra - chave (que não é realmente uma palavra-chave, infelizmente), mas é claro que os valores poderiam serundefined
, então você precisava disso:e a comparação acima funcionaria bem.
No seu segundo exemplo, você provavelmente precisará de parênteses duplos para deixar o fiapo feliz?
fonte
input == undefined
retornarátrue
em umanull
entrada.