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?

Author: Kevin B, 2010-08-27

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.

Para saber disto, e outras partes do "bom contra Mau" do Javascript, lidas sobre o Sr. Douglas Crockford. e o trabalho dele. Há um grande Google Tech Talk onde ele resume muitas boas informações: http://www.youtube.com/watch?v=hQVTIJBZook

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:

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 ou false, 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.
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.
 496
Author: STW, 2017-02-21 23:31:58
Se sabe que são cadeias de caracteres, não há necessidade de verificar o tipo.
"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

 157
Author: Anurag, 2010-08-27 17:40:08

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!
 36
Author: akelec, 2018-04-06 18:11:29

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.
 10
Author: ludico8, 2016-01-26 21:51:55

Existem na verdade duas maneiras em que as cadeias de caracteres podem ser feitas em javascript.

  1. var str = 'Javascript'; isto cria um valor de cadeia primitiva.

  2. var obj = new String('Javascript'); isto cria um objecto Wrap de tipo String.

    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()
 8
Author: Abhishek, 2015-05-02 19:11:31

O que me levou a esta pergunta é o padding e white-spaces

Verifica o meu caso

 if (title === "this word")
      doSomething();

E o título era " this word"

enter image description here

Talvez tenhas de usar a função trim Assim

var title = $(this).text().trim();
 8
Author: Basheer AL-MOMANI, 2016-09-06 06:36:36

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);
 2
Author: Usman, 2018-07-04 12:33:12