Qual é a maneira correta de verificar a igualdade de strings no JavaScript?


844

Qual é a maneira correta de verificar a igualdade entre Strings em JavaScript?


2
Existe uma razão para não usar ==?
Kendrick

21
@Kendrick - com certeza. É do tipo sistema-coerção pode ser incrivelmente intuitiva e pode cometer erros muito fácil esquecer (que parece direito, mas pode ser muito errado)
STW

20
@ Kendrick - porque {} == "[object Object]"avalia como verdadeiro, por exemplo.
Chetan Sastry

12
um pouco irritante que String().equals()não é um método em JS ...
Alexander Mills

2
@AlexanderMills Why?
Ry-

Respostas:


624

sempre Até você entender completamente as diferenças e implicações do uso dosoperadores==e===, use o===operador, pois ele evitará erros e WTFs obscuros (não óbvios). O==operador"regular"pode ter resultados muito inesperados devido à coerção do tipo internamente, portanto, o uso===é sempre a abordagem recomendada.

Para ter uma idéia disso, e outras partes "boas versus más" do Javascript, leia sobre Douglas Crockford e seu trabalho. Há um ótimo Google Tech Talk, onde ele resume muitas informações boas: http://www.youtube.com/watch?v=hQVTIJBZook


Atualizar:

A série Você Não Sabe JS , de Kyle Simpson, é excelente (e é gratuita para leitura on-line). A série aborda as áreas geralmente 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 as armadilhas.

O livro " Up & Going " inclui uma seção sobre Igualdade , com este resumo específico de quando usar os operadores loose ( ==) vs strict ( ===):

Para resumir muitos detalhes em algumas sugestões simples e ajudá-lo a saber se deve usar ==ou ===em várias situações, aqui estão minhas regras simples:

  • Se um dos valores (lado aka) em uma comparação puder ser o valor trueou false, evite ==e use ===.
  • Se ambos os valores em uma comparação pode ser de estes valores específicos ( 0, "", ou []- matriz vazia), evite ==e uso ===.
  • Em todos os outros casos, você é seguro de usar ==. Não é apenas seguro, mas em muitos casos, simplifica seu código de maneira a melhorar a legibilidade.

Eu ainda recomendo a palestra de Crockford para desenvolvedores que não querem investir tempo para realmente entender o Javascript - é um bom conselho para um desenvolvedor que ocasionalmente trabalha em Javascript.


7
Não é necessário quando tiver certeza de todos os operadores são corda, por exemplo, quando se utilizaif (typeof foo == "string")
Marcel Korpel

25
@ Marcel - você está correto, mas é muito melhor sempre usar o ===operador e nunca ter que se preocupar com o "estou realmente, totalmente, 100% certo de que ==se comportará como eu acho?"
STW

7
@STW - um exemplo do porquê de Crockford não ser o alfa e o ômega do JavaScript, é o conselho dele de não usar incremento / decremento unário ( ++/ --).
Marcel Korpel

10
E nunca use ++ou declarações de --linha única if/elseou continueou o newoperador ou qualquer outro número de práticas de código perfeitamente legítimas que Crockford considerou "prejudiciais". E, naturalmente, nunca jamais sequer considerar pensando em usar evalou withmesmo se suas armadilhas são bem compreendidos. E você viu a próxima versão do JS? Sintaxe mais rigorosa e algumas funções auxiliares, algumas que flutuam há anos, são tudo o que temos depois de todo esse tempo. A sintaxe ainda não evoluiu. Se Crockford está por trás disso, tem sido uma coisa ruim.
MooGoo 27/08/10

4
@ CoffeeAddict - um teste rápido no JSFiddle parece discordar. Ambos fazem distinção
STW

205

Se você sabe que são strings, não há necessidade de verificar o tipo.

"a" == "b"

No entanto, observe que os objetos de sequência não serão iguais.

new String("a") == new String("a")

retornará falso.

Chame o método valueOf () para convertê-lo em uma primitiva para objetos String,

new String("a").valueOf() == new String("a").valueOf()

retornará verdadeiro


4
obrigado por esse JSS, dois objetos de sequência nunca serão iguais, a menos que sejam o mesmo objeto, independentemente do valor.
Anurag

4
@ JS: Além disso, new String("a") == "a"é verdade (mas não seria ===), porque o lado esquerdo será convertido em um valor primitivo de string.
Matthew Crumley

5
@JSS: new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")vai todo o retorno false, desde que você está lidando com referências a objetos da Stringclasse, não primitivos do tipo string.
precisa saber é o seguinte

4
Apenas para esclarecer isso para quem estiver lendo. new String(foo)cria um objeto de string e String(foo) converte foo em um primitivo de string.
Brigand

9
@FakeRainBrigand - claro como lama, mas é disso que se trata javascripts, não é?
Periata Breatta 30/09/16

59

Apenas uma adição às respostas: se todos esses métodos retornarem falsos, mesmo que as strings pareçam iguais, é possível que exista um espaço em branco à esquerda e ou à direita de uma string. Então, basta colocar um .trim()no final das strings antes de comparar:

if(s1.trim() === s2.trim())
{
    // your code
}

Perdi horas tentando descobrir o que está errado. Espero que isso ajude alguém!


1
Muito obrigado. No entanto, é estranho para mim, porque me certifiquei de que não houvesse espaço em branco à esquerda ou à direita e, ainda assim, essa era a única maneira de resolver meu problema. Talvez esteja relacionado à representação interna de uma string?
Niko

2
Obrigado @akelec !! @ Niko, provavelmente era devido ao personagem Espaço de Largura Zero, invisível a olho nu. Veja en.wikipedia.org/wiki/Zero-width_space . Mesmo que esse personagem tenha seus propósitos, muitos desenvolvedores se ressentem de sua existência!
stwr667

Obrigado que foi frustrante desde que a verificação de igualdade no meu se estava falhando, mas não vi espaço em branco ao inspecionar durante a depuração.
precisa saber é

Um problema comum ao carregar uma variável de um arquivo de texto (ou seja: usando fetch). Muito obrigado.
Sopalajo de Arrierez 26/11/19

@SopalajodeArrierez, exatamente, há principalmente um espaço ou um retorno de carro no final da string. Você é bem vindo.
akelec

22

o que me levou a essa pergunta é paddingaewhite-spaces

verifique meu caso

 if (title === "LastName")
      doSomething();

e o título era " LastName"

insira a descrição da imagem aqui

então talvez você precise usar trimfunções como esta

var title = $(this).text().trim();

2
Graças mesmos aqui eu usei .toString().trim()à máquina
Akitha_MJ

17

A menos que você realmente saiba como a coerção funciona, evite ==e use o operador de identidade ===. Mas você deve ler isso para entender como funciona .

Se você usar ==, deixe o idioma fazer algum tipo de coerção para você, por exemplo:

"1" == 1 // true
"0" == false // true
[] == false // true

Como Douglas Crockford disse em seu livro:

É sempre melhor usar o operador de identidade.


3
Embora esse link possa responder à pergunta, é melhor incluir aqui as partes essenciais da resposta e fornecer o link para referência. As respostas somente para links podem se tornar inválidas se a página vinculada for alterada.
Parkash Kumar 22/10/2015

{}==" "me deu Unexpected token ==qual é a maneira correta de fazer isso?
Basheer AL-MOMANI

12

Na verdade, existem duas maneiras pelas quais as strings podem ser criadas em javascript.

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

  2. var obj = new String('Javascript');Isso cria um objeto do tipo wrapper String.

    typeof str // string
    typeof obj // object

Portanto, a melhor maneira de verificar a igualdade é usar o ===operador, pois ele verifica o valor e o tipo dos dois operandos.

Se você deseja verificar a igualdade entre dois objetos, usar String.prototype.valueOfé o caminho correto.

new String('javascript').valueOf() == new String('javascript').valueOf()

6

A sequência Objectspode ser verificada usando o JSON.stringyfy()truque.

var me = new String("me");
var you = new String("me");
var isEquel = JSON.stringify(me) === JSON.stringify(you);
console.log(isEquel);


1

Considerando que ambas as cadeias podem ser muito grandes, existem 2 abordagens principais bitwise searchelocaleCompare

Eu recomendei esta função

function compareLargeStrings(a,b){
    if (a.length !== b.length) {
         return false;
    }
    return a.localeCompare(b) === 0;
}

-2

A maneira mais fácil de fazer isso é usar um operador ternário da seguinte forma:

 "was" == "was" ? true : false

mas se a string que você deseja comparar estiver em uma matriz, você usará o filtro es6

let stringArray  = ["men", "boys", "girls", "sit", "can", "gotten"]
stringArray.filter(I=> I === boys ? 
stringArray.pop(indexOf(I)) : null)

o acima irá verificar seu stringArray e qualquer string que corresponda a ela da matriz que, no nosso caso, escolhemos "boys"


-8

Eu vim com uma solução alternativa durante o teste. você pode usar a função no protótipo de string.

String.prototype.betwenStr = function(one){

return JSON.stringify(new String(this)) === JSON.stringify(new String(one));

}


 //call it
 "hello world".betweenStr("hello world"); //returns boolean 
 //value

funciona bem em navegadores Chrome


A pergunta pergunta como verificar se "olá mundo" = "olá mundo", não como verificar se "olá mundo" é uma sequência.
Nick

4
Isso é bobagem. Você criou uma versão do Rube Goldberg ==.
JJJ

Oi OP, sua edição é completamente diferente em sua parte espiritual, e sua resposta já recebeu muitos votos negativos. Exorto-vos agradar para remover esta resposta e postar um novo com a sua versão editada
Yılmaz Durmaz
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.