Qual é a maneira correta de verificar a igualdade de string em JavaScript?
Qual é a forma correcta de verificar a igualdade entre cadeias de caracteres em JavaScript?
7 answers
Sempre até que você entenda completamente as diferenças e implicações de usar os operadores ==
e ===
, use o operador ===
, uma vez que ele irá salvá-lo de erros obscuros (não-óbvios) e WTFs. O operador" regular " ==
pode ter resultados muito inesperados devido ao tipo-coerção internamente, por isso o uso de ===
é sempre a abordagem recomendada.
Actualizar:
A série do Kyle Simpson é excelente (e livre para ler online). A série vai para as áreas comumente incompreendidas da linguagem e explica as "partes ruins" que Crockford sugere que você evite. Ao entendê-los você pode fazer uso adequado deles e evitar o perigo.O livro "Up & Going " inclui uma secção sobre Equality , com este resumo específico de quando usar o loose ({[[0]}) vs strict (===
) operadores:
Ainda recomendo a palestra de Crockford para desenvolvedores que não querem investir o tempo para realmente entender Javascript-é um bom conselho para um desenvolvedor que só ocasionalmente trabalha em Javascript.Ferver um monte de detalhes para algumas simples lições, e ajudá-lo a saber se para usar
==
ou===
em várias situações, aqui estão as minhas regras simples:
- Se o valor (também conhecido por lado) numa comparação puder ser o valor
true
oufalse
, evite==
e utilize===
.- Se qualquer dos valores numa comparação puder ser destes valores específicos(
0
,""
, ou[]
-- vazio array), evitar==
e utilizar===
.- em todos os outros casos , é seguro usar {[[0]}. Não só é seguro, mas em muitos casos simplifica o seu código de uma forma que melhora a legibilidade.
"a" == "b"
No entanto, note que os objectos de texto não serão iguais.
new String("a") == new String("a")
Vai voltar falso.
Chame o método de valor() para convertê-lo em um primitivo para objetos de Cadeia,
new String("a").valueOf() == new String("a").valueOf()
Voltará a ser verdadeiro
Apenas uma adição às respostas: Se todos estes métodos retornarem falsos, mesmo que as cadeias pareçam ser iguais, é possível que haja um espaço em branco à esquerda e ou à direita de uma cadeia. Então, basta colocar um .trim()
no final das cordas antes de comparar:
if(s1.trim() === s2.trim())
{
// your code
}
Perdi horas a tentar descobrir o que se passa.
Espero que isto ajude alguém!
A menos que você realmente saiba como a coerção funciona, você deve evitar ==
e usar o operador de identidade ===
em vez disso.Mas devias ler isto para entender como funciona.
Se você usar ==
, você deixa a linguagem fazer algum tipo de coerção para você, então, por exemplo:
"1" == 1 // true
"0" == false // true
[] == false // true
Como Douglas Crockford disse no seu livro:
É sempre melhor usar o operador de identidade.
Existem na verdade duas maneiras em que as cadeias de caracteres podem ser feitas em javascript.
var str = 'Javascript';
isto cria um valor de cadeia primitiva.-
var obj = new String('Javascript');
isto cria um objecto Wrap de tipoString
.typeof str // string
typeof obj // object
Então a melhor maneira de verificar a igualdade é usando o operador {[[6]} porque ele verifica o valor, bem como o tipo de ambos os operandos.
Se quiser verificar a igualdade entre dois objectos, então usar String.prototype.valueOf
é a correcto.
new String('javascript').valueOf() == new String('javascript').valueOf()
O texto Objects
pode ser verificado com este hack JSON.stringyfy()
var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);