Recentemente, eu estava executando parte do meu código por meio de JSLint quando encontrei esse erro. O que eu acho engraçado sobre esse erro, porém, é que ele assume automaticamente que todos == deveriam ser ===.
Isso realmente faz algum sentido? Eu pude ver muitos casos em que você não gostaria de comparar o tipo e estou preocupado que isso possa realmente causar problemas.
A palavra "Esperado" implicaria que isso deve ser feito TODAS as vezes ... Isso é o que não faz sentido para mim.
javascript
jslint
Metrópole
fonte
fonte
myVar == null
verificação, sim, grandes mudanças. ; ^) O argumento de Crockford é que tornou o significado do código mais preciso, e isso é difícil de argumentar.Respostas:
IMO, usar cegamente
===
, sem tentar entender como funciona a conversão de tipo , não faz muito sentido.O principal medo sobre o operador Equals
==
é que as regras de comparação, dependendo dos tipos comparados, podem tornar o operador não transitivo, por exemplo, se:Realmente não garante que:
Por exemplo:
'0' == 0; // true 0 == ''; // true '0' == ''; // false
O operador Strict Equals
===
não é realmente necessário quando você compara valores do mesmo tipo, o exemplo mais comum:if (typeof foo == "function") { //.. }
Comparamos o resultado do
typeof
operador, que é sempre uma string , com um literal de string ...Ou quando você conhece as regras de coerção de tipo, por exemplo, verifique se algo é
null
ouundefined
algo:if (foo == null) { // foo is null or undefined } // Vs. the following non-sense version: if (foo === null || typeof foo === "undefined") { // foo is null or undefined }
fonte
===
operador é a clareza do código. Não existe uma situação razoável a ser usada==
, pois nunca será tão clara e compreensível quanto o operador de identidade. Não se trata de entender os operadores ou não, mas de usar aquele que torna seu código mais legível e quase sem custo. Os únicos desenvolvedores que estão argumentando contra o operador de identidade são desenvolvedores solo e pessoas que não trabalham em equipes. Por definição, pessoas cujo código não é revisado por olhos suficientes.there is no reasonable situation
é uma distorção grosseira. Pense nos tipos de Javascript (nativos)Number
eString
. Sua existência prova que os autores de Javascript tinham certos casos de uso em mente==
. Você realmente acha quenew String('hi') === 'hi'
avaliarfalse
é muito claro? Escreva um trecho de código que teste o argumento de sua função contra a'hi'
aceitação de String e string e me diga que está claro.JSLint é inerentemente mais defensivo do que a sintaxe Javascript permite.
Da documentação JSLint:
fonte
==
operador. O===
é um caso especial ... JSLint tenta fazer parecer que usando==
de alguma forma estar errado ... No entanto, tente o seguinte:var x = 4, y = new Number(4); if (x == y) {alert('Javascript depends on == just embrace it!');}
. Os tipos primitivos têm classes correspondentes que os substituem (Number
,String
) e o Javascript depende do==
operador para torná-los naturais.Lembre-se de que o JSLint impõe a ideia de uma pessoa do que um bom JavaScript deve ser. Você ainda precisa usar o bom senso ao implementar as mudanças que ele sugere.
Em geral, comparar tipo e valor tornará seu código mais seguro (você não terá o comportamento inesperado quando a conversão de tipo não fizer o que você acha que deveria).
fonte
Triplo igual é diferente de duplo igual porque, além de verificar se os dois lados têm o mesmo valor, triplo igual também verifica se eles são do mesmo tipo de dados.
Então,
("4" == 4)
é verdade, mas("4" === 4)
é falso.Triplo-igual também é executado um pouco mais rápido, porque JavaScript não precisa perder tempo fazendo nenhuma conversão de tipo antes de fornecer a resposta.
JSLint visa deliberadamente tornar seu código JavaScript o mais estrito possível, com o objetivo de reduzir bugs obscuros. Ele destaca esse tipo de coisa para tentar fazer com que você codifique de uma forma que o force a respeitar os tipos de dados.
Mas o bom do JSLint é que ele é apenas um guia. Como dizem no site, vai magoar seus sentimentos, mesmo se você for um programador de JavaScript muito bom. Mas você não deve se sentir obrigado a seguir seus conselhos. Se você leu o que ele tem a dizer e o entende, mas tem certeza de que seu código não vai quebrar, então não há compulsão para mudar nada.
Você pode até mesmo dizer ao JSLint para ignorar categorias de verificações se não quiser ser bombardeado com avisos de que nada fará a respeito.
fonte
Uma citação de http://javascript.crockford.com/code.html :
JSLint é muito rígido, seu 'webjslint.js' nem passa pela sua própria validação.
fonte
webjslint.js
não validar - embora a maioria dos erros que vejo agora tenham a ver com espaçamento. Claramente, deve-se usar bom senso e julgamento razoável ao revisar JavaScript usando JSLint.always
desqualifica automaticamente esta citação como sabedoria. Programadores inteligentes não são dogmáticos. Eles usam o que há de melhor em determinada situação. E eles acolhem e abraçam qualquer ferramenta embutida no núcleo da linguagem, não apenas descartando-a com umjust never touch it
. Resumindo: Meu código é mais curto (e não apenas para salvar um=
caractere), portanto, meu site carrega mais rápido, com menor custo de largura de banda, portanto, meu usuário é melhor atendido.Se você quiser testar a falsidade. JSLint não permite
if (foo == null)
mas permite
if (!foo)
fonte
===
, que o JSLint recomenda.foo == null
verifica se há nulo ou indefinido.!foo
verifica se há string nula, indefinida, 0 e vazia.Para ajudar a explicar esta questão e também explicar por que o NetBeans (de) 7.3 começou a mostrar este aviso, este é um extrato da resposta no rastreador de bug do NetBeans quando alguém relatou isso como um bug:
É uma boa prática usar === em vez de == em JavaScript.
Referência
fonte
Bem, isso não pode realmente causar problemas, é apenas dar conselhos. É pegar ou largar. Dito isso, não tenho certeza de quão inteligente é. Pode muito bem haver contextos em que isso não apresente como um problema.
fonte