Estou usando o JSLint para passar pelo JavaScript, e ele está retornando muitas sugestões para substituir ==
(dois sinais de igual) por ===
(três sinais de igual) ao fazer coisas como comparar idSele_UNVEHtype.value.length == 0
dentro de uma if
instrução.
Existe um benefício de desempenho para substituir ==
com ===
?
Qualquer melhoria de desempenho seria bem-vinda, pois existem muitos operadores de comparação.
Se nenhuma conversão de tipo ocorrer, haverá um ganho de desempenho superior ==
?
=== vs ==
, mas em PHP, pode ler aqui: stackoverflow.com/questions/2401478/why-is-faster-than-in-php/…===
é muito mais rápido que==
. jsperf.com/comparison-of-comparisons===
excesso==
. De fato, o benchmark não mostra uma grande diferença entre ambos nos navegadores modernos. Pessoalmente, eu costumo usar em==
qualquer lugar, a menos que eu realmente precise de uma igualdade estrita.===
e==
operadores: youtube.com/... Se ele não jogar, é a 15:20Respostas:
O operador de igualdade estrita (
===
) se comporta de forma idêntica ao operador de igualdade abstrata (==
), exceto que nenhuma conversão de tipo é feita e os tipos devem ser os mesmos para serem considerados iguais.Referência: Tutorial Javascript: Operadores de Comparação
O
==
operador comparará a igualdade depois de realizar as conversões de tipo necessárias . O===
operador não fará a conversão; portanto, se dois valores não forem do mesmo tipo===
, retornará simplesmentefalse
. Ambos são igualmente rápidos.Para citar o excelente JavaScript de Douglas Crockford : The Good Parts ,
Atualizar:
Um ponto positivo foi levantado por @Casebash nos comentários e na resposta de @Phillipe Laybaert sobre objetos. Para objetos, e ajam de forma consistente um com o outro (exceto em um caso especial).
==
===
O caso especial é quando você compara uma primitiva com um objeto que é avaliado com a mesma primitiva, devido ao seu
toString
ouvalueOf
método. Por exemplo, considere a comparação de uma primitiva de string com um objeto de string criado usando oString
construtor.Aqui o
==
operador está verificando os valores dos dois objetos e retornandotrue
, mas===
está vendo que eles não são do mesmo tipo e estão retornandofalse
. Qual deles está correto? Isso realmente depende do que você está tentando comparar. Meu conselho é ignorar completamente a questão e simplesmente não usar oString
construtor para criar objetos de string a partir de literais de string.Referência
http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3
fonte
Usando o
==
operador ( Igualdade )Usando o
===
operador ( Identity )Isso ocorre porque o operador de igualdade
==
digita coerção , o que significa que o intérprete tenta implicitamente converter os valores antes de comparar.Por outro lado, o operador de identidade
===
não faz coerção de tipo e, portanto, não converte os valores ao comparar e, portanto, é mais rápido (conforme o teste de benchmark This JS ), pois pula uma etapa.fonte
==
"igualdade abstrata" e===
"igualdade estrita". Concedido chamar==
qualquer tipo de "igualdade" é IMHO horrível, uma vez que não é transitivo, mas por que reclamar? Eu levo mais problemas com a "identidade"; Eu acho que esse termo é bastante enganador, embora "funcione". Mas, falando sério, quem cunhou o termo "identidade"? Eu procuro o padrão e não o encontrei.Uma representação pictórica interessante da comparação de igualdade entre
==
e===
.Fonte: http://dorey.github.io/JavaScript-Equality-Table/
var1 === var2
var1 == var2
fonte
x == null
com segurança para verificar sex
énull
ouundefined
.==
vs===
. As maiúsculas e minúsculas são desiguais de qualquer maneira e retornamfalse
com ambos==
e===
operadores. Além disso, as palavras-chavetrue
,false
,undefined
,null
,Infinity
existir em JS em apenas um caso, e não pode ser utilizado em casos superiores ou mistos.Nas respostas aqui, eu não li nada sobre o que significa igual . Alguns dirão que isso
===
significa igual e do mesmo tipo , mas isso não é verdade. Na verdade, significa que os dois operandos referenciam o mesmo objeto ou, no caso de tipos de valor, têm o mesmo valor .Então, vamos pegar o seguinte código:
O mesmo aqui:
Ou até:
Esse comportamento nem sempre é óbvio. A história tem mais do que ser igual e ser do mesmo tipo.
A regra é:
Para tipos de valores (números):
a === b
retorna true sea
eb
tiver o mesmo valor e for do mesmo tipoPara tipos de referência:
a === b
retorna true sea
e fazb
referência exatamente ao mesmo objetoPara strings:
a === b
retorna true sea
eb
são ambas strings e contêm exatamente os mesmos caracteresStrings: o caso especial ...
As strings não são tipos de valor, mas em Javascript se comportam como tipos de valor, portanto serão "iguais" quando os caracteres na string forem iguais e quando tiverem o mesmo comprimento (conforme explicado na terceira regra)
Agora isso se torna interessante:
Mas e quanto a isso ?:
Eu pensei que seqüências de caracteres se comportam como tipos de valor? Bem, depende de quem você pergunta ... Nesse caso, aeb não são do mesmo tipo.
a
é do tipoObject
, enquantob
é do tipostring
. Lembre-se de que a criação de um objeto de string usando oString
construtor cria algo do tipoObject
que se comporta como uma string na maioria das vezes .fonte
new Number() == "0"
. Também no Firefox:(function(){}) == "function () {\n}"
new String("123") !== "123"
. Eles são tipos diferentes. Simples, mas confuso.String
objetos se comportam como cadeias de caracteres como qualquer outro objeto .new String
nunca deve ser usado, pois isso não cria strings reais. Uma string real e pode ser feita com literais de string ou chamandoString
como uma função semnew
, por exemplo:String(0); //"0", Real string, not an object
Deixe-me adicionar este conselho:
Em caso de dúvida, leia a especificação !
ECMA-262 é a especificação para uma linguagem de script da qual o JavaScript é um dialeto. Obviamente, na prática, importa mais como os navegadores mais importantes se comportam do que uma definição esotérica de como algo deve ser tratado. Mas é útil entender por que a nova String ("a")! == "a" .
Deixe-me explicar como ler a especificação para esclarecer esta questão. Vejo que, neste tópico muito antigo, ninguém teve uma resposta para o efeito muito estranho. Portanto, se você pode ler uma especificação, isso o ajudará tremendamente em sua profissão. É uma habilidade adquirida. Então, vamos continuar.
Pesquisando === no arquivo PDF, chego à página 56 da especificação: 11.9.4. O operador Strict Equals (===) e, depois de percorrer as instruções específicas, encontro:
Interessante é a etapa 11. Sim, as strings são tratadas como tipos de valor. Mas isso não explica por que a nova String ("a")! == "a" . Temos um navegador que não esteja em conformidade com a ECMA-262?
Não tão rápido!
Vamos verificar os tipos dos operandos. Experimente você mesmo envolvendo-os em typeof () . Acho que new String ("a") é um objeto e a etapa 1 é usada: retorne false se os tipos forem diferentes.
Se você se pergunta por que a nova String ("a") não retorna uma string, que tal um exercício de leitura de uma especificação? Diverta-se!
Aidiakapi escreveu isso em um comentário abaixo:
new sempre retorna um Object, mesmo para construtores String . E ai! A semântica de valor para seqüências de caracteres (consulte a etapa 11) é perdida.
E isso finalmente significa: nova String ("a")! == "a" .
fonte
new String('x')
, porque nunca vi nenhum código na natureza que use objetos wrapper primitivos, e acho que não há muitas boas razões para isso, principalmente hoje em dia. Você já encontrou um código que faz isso?new String()
.new String()
é provavelmente a menor das suas preocupações. Entendo a preocupação em teoria, mas, novamente, você tem exemplos do mundo real? Para mim, é como a velha ansiedade que alguém poderia definirundefined
com outro valor.Em PHP e JavaScript, é um operador estrito de igualdade. O que significa que ele irá comparar o tipo e os valores.
fonte
var a = {}, b = {};
a == b
retorna falso.var a = {}, b = {};
Embora ambosa
e deb
fato ambos sejam um objeto, mas eles não têm o mesmo valor, tecnicamente falando. São instâncias diferentes . Observe que a comparação de instâncias se comporta de maneira diferente da comparação de primitivas. O que provavelmente aumenta essa confusão. Você verá um comportamento de comparação semelhante se usar a versão da instância dos tipos de dados primitivos. Por exemplo,new String('asdf')
ounew Number(5)
. Ex:new Number(5) == new Number(5)
é falso, mesmo que eles possuam o mesmo valor.Eu testei isso no Firefox com o Firebug usando código como este:
e
Meus resultados (testados cinco vezes cada e com média):
Então, eu diria que a diferença minúscula (são mais de 100000 iterações, lembre-se) é insignificante. O desempenho não é uma razão para fazer
===
. Digite safety (bem, o mais seguro que você conseguir em JavaScript) e a qualidade do código é.fonte
==
discordam.==
operador? Lembre-se, é aí que há um aumento no desempenho.===
excessivo,==
mas está errado que o desempenho deles seja essencialmente igual e que você pensaria que esse teste prova que, e que muitas outras pessoas concordaram, é totalmente absurdo para mim.Em JavaScript, significa o mesmo valor e tipo.
Por exemplo,
mas
fonte
O === operador é chamado um operador de comparação estrita, que não diferem do == operador.
Vamos pegar 2 vars a e b.
Para "a == b" avaliar como verdadeiro aeb precisa ser o mesmo valor .
No caso de "a === b" a e b devem ter o mesmo valor e também o mesmo tipo para que seja avaliado como verdadeiro.
Veja o exemplo a seguir
Em resumo ; o uso do operador == pode ser avaliado como verdadeiro em situações nas quais você não deseja, usando o === operador seria mais seguro.
No cenário de 90% de uso, não importa qual você usar, mas é útil saber a diferença quando você obtiver algum comportamento inesperado um dia.
fonte
Por quê
==
é tão imprevisível?O que você ganha quando compara uma string vazia
""
com o número zero0
?true
Sim, está certo de acordo com
==
uma string vazia e o número zero é ao mesmo tempo.E não termina aí, aqui está outro:
As coisas ficam realmente estranhas com matrizes.
Então mais estranho com cordas
Fica pior:
Quando é igual não é igual?
Deixe-me dizer isso de novo:
E este é apenas o material maluco que você recebe com os primitivos.
É um nível totalmente novo de loucura quando você usa
==
objetos.Neste ponto, você provavelmente está se perguntando ...
Por que isso acontece?
Bem, é porque, ao contrário de "triple equals" (
===
), apenas verifica se dois valores são iguais.==
faz um monte de outras coisas .Possui tratamento especial para funções, tratamento especial para nulos, indefinidos, cadeias, o nome dele.
Fica muito maluco.
De fato, se você tentasse escrever uma função que faça o
==
que seria, seria algo como isto:Então o que isso quer dizer?
Isso significa
==
é complicado.Por ser complicado, é difícil saber o que acontecerá quando você o usar.
O que significa que você pode acabar com bugs.
Então a moral da história é ...
Torne sua vida menos complicada.
Use em
===
vez de==
.O fim.
fonte
looseEqual
está errado.Function == Function.toString()
é verdade, maslooseEqual(Function, Function.toString())
é falsa. Não sei por que você filtra as funções no início.typeof x === "object"
para verificar se é um objeto, mas `typeof só funciona para primitivas não nulas. Você pode estar interessado na minha lista de formas adequadas para verificar se um valor é um objeto(function blah() { console.log("test"); }) != {valueOf:function(){return "function blah() { console.log(\"test\"); }";}}
- verificação para este JS violino que executa todos os testes: jsfiddle.net/luisperezphd/7k6gcn6g (há 1.225 permutações de teste)==
faz muitas coisas, dificultando a antecipação dos resultados, embora===
seja muito mais direto e previsível, sendo uma das principais razões===
a escolha recomendada. (Vou acrescentar uma nota para a resposta mencionando o seu ponto)===
verifica que os mesmos lados têm o mesmo tipo e valor .Exemplo:
Exemplo comum:
Outro exemplo comum:
Muitas vezes um untyped cheque seria útil porque você não se importa se o valor é ou
undefined
,null
,0
ou""
fonte
'string' !== 'number'
Diagrama de fluxo de execução Javascript para igualdade estrita / Comparação '==='
Diagrama de fluxo de execução Javascript para igualdade / comparação não estrita '=='
fonte
string
seta está apontando para a grande caixa cinza; isso significa que o interruptor está convertendo a string em um número?string
deve ser comparado a um tiponumber
, de modo que o interruptor analisa o que a string deve ser comparada e a projeta adequadamente.ToNumber
que retornaria quando eram fornecidos tipos diferentes; portanto, se receber uma sequência, ela escolherá apenas a última opção (e a converterá em um número).==
usaToNumber
somente nos casosstring == number
ouboolean == anything
acima (e somente nostring
/boolean
). Isso significa==
que nunca será convertidoundefined
ounull
mesmo que eles estejam na caixa cinza. (Para qualquer combinação de umundefined
ou denull
ambos,==
sempre retornarátrue
. Além disso, se um valor está no lado esquerdo ou direito não importa,==
(e===
) retornará o mesmo resultado.)JavaScript
===
vs==
.fonte
Significa igualdade sem coerção de tipo coerção de tipo significa que o JavaScript não converte automaticamente outros tipos de dados em tipos de dados de cadeia
fonte
Em um script típico, não haverá diferença de desempenho. Mais importante pode ser o fato de mil "===" serem 1 KB mais pesados que mil "==" :) Os criadores de perfil JavaScript podem dizer se existe uma diferença de desempenho no seu caso.
Mas, pessoalmente, eu faria o que JSLint sugere. Essa recomendação existe não por causa de problemas de desempenho, mas porque o meio de coerção de tipo
('\t\r\n' == 0)
é verdadeiro.fonte
O operador de comparação igual == é confuso e deve ser evitado.
Se você precisa viver com ele, lembre-se das três coisas a seguir:
TABELA DA VERDADE DO OPERADOR IGUAL NO JAVASCRIPT
** STRANGE: observe que quaisquer dois valores na primeira coluna não são iguais nesse sentido. **
fonte
É improvável que haja qualquer diferença de desempenho entre as duas operações em seu uso. Não há conversão de tipo a ser feita porque os dois parâmetros já são do mesmo tipo. Ambas as operações terão uma comparação de tipo seguida por uma comparação de valor.
fonte
Sim! Isto é importante.
===
O operador em javascript verifica o valor e o tipo where, como o==
operador apenas verifica o valor (digita a conversão, se necessário) .Você pode testá-lo facilmente. Cole o seguinte código em um arquivo HTML e abra-o no navegador
Você receberá ' false ' em alerta. Agora modifique o
onPageLoad()
método para quealert(x == 5);
você se torne verdadeiro .fonte
===
O operador verifica os valores e os tipos das variáveis quanto à igualdade.==
O operador apenas verifica o valor das variáveis quanto à igualdade.fonte
É um teste estrito de verificação.
É uma coisa boa, especialmente se você estiver verificando entre 0 e falso e nulo.
Por exemplo, se você tiver:
Então:
Tudo retorna verdadeiro e você pode não querer isso. Vamos supor que você tenha uma função que pode retornar o 0º índice de uma matriz ou falhar em caso de falha. Se você marcar com "==" false, poderá obter um resultado confuso.
Portanto, com a mesma coisa que acima, mas com um teste rigoroso:
fonte
0 != null
. -1O JSLint às vezes fornece razões irrealistas para modificar coisas.
===
tem exatamente o mesmo desempenho que==
se os tipos já fossem os mesmos.É mais rápido apenas quando os tipos não são os mesmos; nesse caso, ele não tenta converter tipos, mas retorna diretamente um false.
Então, IMHO, JSLint talvez seja usado para escrever um novo código, mas a otimização excessiva inútil deve ser evitada a todo custo.
Ou seja, não há razão para mudar
==
para===
em uma verificação comoif (a == 'test')
quando você a conhece pelo fato de que a pode ser apenas uma String.Modificar muito código dessa maneira desperdiça o tempo dos desenvolvedores e revisores e não alcança nada.
fonte
Simplesmente
==
significa comparação entre operandos comtype conversion
&
===
significa comparação entre operandos semtype conversion
Conversão de tipo em javaScript significa que o javaScript converte automaticamente quaisquer outros tipos de dados em tipos de string.
Por exemplo:
fonte
Um exemplo simples é
fonte
As 2 principais respostas mencionadas == significa igualdade e === significa identidade. Infelizmente, esta afirmação está incorreta.
Se os dois operandos de == forem objetos, eles serão comparados para ver se são o mesmo objeto. Se os dois operandos apontarem para o mesmo objeto, o operador igual retornará verdadeiro. Caso contrário, os dois não são iguais.
No código acima, ambos == e === ficam falsos porque aeb não são os mesmos objetos.
Ou seja: se ambos os operandos de == são objetos, == se comporta da mesma forma que ===, o que também significa identidade. A diferença essencial desses dois operadores é sobre conversão de tipos. == tem conversão antes de verificar a igualdade, mas === não.
fonte
Como regra geral, eu geralmente usava em
===
vez de==
(e em!==
vez de!=
).Os motivos são explicados nas respostas acima e também Douglas Crockford é bastante claro sobre isso ( JavaScript: The Good Parts ).
No entanto, há uma única exceção :
== null
é uma maneira eficiente de verificar se 'é nulo ou indefinido':Por exemplo, o jQuery 1.9.1 usa esse padrão 43 vezes, e o verificador de sintaxe JSHint ainda fornece a
eqnull
opção relaxante por esse motivo.No guia de estilo do jQuery :
fonte
O problema é que você pode facilmente ter problemas, já que o JavaScript tem muitas conversões implícitas, o que significa ...
O que logo se torna um problema. O melhor exemplo de por que a conversão implícita é "maligna" pode ser obtido desse código no MFC / C ++, que na verdade será compilado devido a uma conversão implícita de CString em HANDLE, que é um tipo de tipo de ponteiro ...
O que obviamente durante o tempo de execução faz muito coisas indefinidas ...
Google para conversões implícitas em C ++ e STL para obter alguns dos argumentos contra ele ...
fonte
0 == null
é falso.A partir da referência principal do javascript
fonte
Comparação de igualdade:
Operador
==
Retorna true, quando os dois operandos são iguais. Os operandos são convertidos para o mesmo tipo antes de serem comparados.
Igualdade e comparação de tipos:
Operador
===
Retorna true se os dois operandos forem iguais e do mesmo tipo. Geralmente é melhor e mais seguro se você comparar dessa maneira, porque não há conversões de tipo nos bastidores.
fonte
Aqui está uma tabela de comparação prática que mostra as conversões que acontecem e as diferenças entre
==
e===
.Como afirma a conclusão:
http://dorey.github.io/JavaScript-Equality-Table/
fonte
nulo e indefinido são o nada, isto é,
Aqui
a
eb
não tem valores. Considerando que 0, false e '' são todos valores. Uma coisa comum entre todos esses é que todos são valores falsificados, o que significa que todos satisfazem condições falsas.Portanto, 0, false e '' juntos formam um subgrupo. E por outro lado, nulo e indefinido formam o segundo subgrupo. Verifique as comparações na imagem abaixo. nulo e indefinido seriam iguais. Os outros três seriam iguais. Mas todos eles são tratados como condições falsas no JavaScript.
É o mesmo que qualquer objeto (como {}, matrizes etc.), string não vazia e Boolean true são condições verdadeiras. Mas, eles não são todos iguais.
fonte