JavaScript에서 문자열 동등성을 확인하는 올바른 방법은 무엇입니까?


842

JavaScript에서 문자열 간의 동등성을 확인하는 올바른 방법은 무엇입니까?


2
==를 사용하지 않는 이유가 있습니까?
Kendrick

21
@ 켄드릭-물론. 그것은의 타입 강제 변환 시스템은 매우 직관적 수 있으며 간과하는 것은 매우 쉬운 오류를 만들 수 있습니다 (이 보이는 바로,하지만 매우 잘못 될 수 있습니다)
STW

20
@Kendrick- {} == "[object Object]"예를 들어 true로 평가 되기 때문 입니다.
Chetan Sastry

12
String().equals()JS의 방법이 아닌 다소 성가신 ...
Alexander Mills

2
@AlexanderMills 왜?
Ry-

답변:


624

항상== and===연산자를 사용하는것의 차이점과 의미를 완전히 이해하기 전에는연산자를 사용하십시오===. "일반"==연산자는 내부적으로 유형 강제로 인해 예상치 못한 결과를 초래할 수 있으므로===항상 사용하는 것이 좋습니다.

이것에 대한 통찰력과 Javascript의 다른 "좋은 대 나쁜"부분은 Douglas Crockford 씨와 그의 연구에서 읽었습니다. 훌륭한 Google Tech Talk에서 유용한 정보를 많이 요약합니다. http://www.youtube.com/watch?v=hQVTIJBZook


최신 정보:

Kyle Simpson 의 You Do n't Know JS 시리즈는 훌륭하며 온라인에서 무료로 읽을 수 있습니다. 이 시리즈는 일반적으로 잘못 이해되는 언어 영역으로 들어가며 Crockford가 제안한 "나쁜 부분"을 설명합니다. 그것들을 이해함으로써 당신은 그것들을 올바르게 사용하고 함정을 피할 수 있습니다.

" Up & Going "책에는 Equality에 대한 섹션이 포함되어 있으며 느슨한 ( ==) 대 엄격한 ( ===) 연산자 를 사용하는시기를 구체적으로 요약합니다 .

몇 가지 간단한 테이크 아웃에 대한 자세한 내용을 요약하고 사용 여부 ==또는 ===다양한 상황에서 알 수 있도록 도와주는 간단한 규칙은 다음과 같습니다.

  • 비교에서 값 (일명 측면)이 true또는 false값일 수있는 경우 피하고 ==사용하십시오 ===.
  • 비교에서 하나의 값이 특정 값 (이 될 수 있다면 0, ""또는 []피 - 빈 배열) ==사용 ===.
  • 에서 모든 다른 경우, 넌 안전 사용합니다 ==. 안전 할뿐만 아니라 대부분의 경우 가독성을 향상시키는 방식으로 코드를 단순화합니다.

Javascript를 실제로 이해하기 위해 시간을 투자하고 싶지 않은 개발자를위한 Crockford의 강연은 여전히 ​​권장합니다. Javascript로 가끔 일하는 개발자에게는 좋은 조언입니다.


7
두 피연산자가 모두 문자열인지 확신 할 때는 필요하지 않습니다. 예를 들어 다음을 사용할 때if (typeof foo == "string")
Marcel Korpel

25
@Marcel-당신은 맞지만, 항상=== 연산자를 사용하는 것이 훨씬 낫고 " ==내가 생각하는 방식대로 행동 할 것이라고 정말로 100 % 확신하고 있습니까?"
STW

7
@STW – Crockford가 JavaScript의 알파 및 오메가가 아닌 이유 중 하나는 단항 증분 / 감소 ( ++/ --) 를 사용하지 않는 충고 입니다.
Marcel Korpel

10
그리고 사용하지 않을 ++또는 --한 줄 또는 if/else진술 또는 continue또는 new운영자 또는 크록 포드는 "유해한"것으로 간주 것을 완벽하게 합법적 인 코드 관행의 다른 수를. 물론 결코 이제까지 도 사용에 대한 생각을 고려하지 eval또는 with자신의 함정을 잘 이해하는 경우에도 마찬가지입니다. 그리고 JS의 다음 버전을 보셨습니까? 몇 년 동안 떠 다니는 더 엄격한 구문과 소수의 도우미 함수는이 모든 시간 후에 얻을 수있는 모든 것입니다. 구문은 전혀 발전하지 않았습니다. Crockford가 이것 뒤에 있다면, 그것은 나쁜 일이었습니다.
MooGoo

4
@CoffeeAddict-JSFiddle의 빠른 테스트가 동의하지 않는 것 같습니다. 그들은 대소 문자를 구분 모두 : jsfiddle.net/st2EU
STW

204

문자열이라는 것을 알고 있다면 타입을 확인할 필요가 없습니다.

"a" == "b"

그러나 문자열 객체는 동일하지 않습니다.

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

거짓을 반환합니다.

valueOf () 메소드를 호출하여 String 오브젝트의 기본 요소로 변환하십시오.

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

사실을 반환합니다


4
JSS에 감사드립니다. 두 문자열 객체는 값에 관계없이 동일한 객체가 아닌 한 동일하지 않습니다.
Anurag

4
@JSS : 또한 왼쪽이 기본 문자열 값으로 변환되기 때문에 new String("a") == "a"true입니다 (그러나는 포함되지 않음 ===).
Matthew Crumley

5
@JSS : new String("a") == new String("a"), new String("a") === new String("b"), new String("a") === new String("a")모든 반환 false, 당신은의 객체에 대한 참조를 처리하고 이후 String클래스 유형이 아닌 프리미티브 string.
palswim

4
그것을 읽는 사람에게 이것을 명확히하기 위해. new String(foo)문자열 생성 객체를 , 그리고 String(foo) 변환은 원시 문자열로 foo는.
Brigand

9
@ FakeRainBrigand-진흙처럼 분명하지만 그것이 자바 스크립트에 관한 것입니까?
Periata Breatta

58

대답에 한 가지 추가 사항 :이 방법이 모두 false를 반환하면 문자열이 같더라도 한 문자열의 왼쪽 및 오른쪽에 공백이있을 수 있습니다. 따라서 .trim()비교하기 전에 문자열 끝에 a 를 넣으십시오 .

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

무엇이 잘못되었는지 알아 내려고 시간을 잃었습니다. 이것이 누군가에게 도움이되기를 바랍니다!


1
고마워 왼쪽이나 오른쪽에 공백이 없는지 확인했지만 이것이 내 문제를 해결할 수있는 유일한 방법 이었기 때문에 나에게는 이상합니다. 어쩌면 문자열의 내부 표현과 관련이 있습니까?
니코

2
감사합니다 @akelec !! @Niko, 육안으로는 보이지 않는 Zero-Width-Space 특성 때문일 수 있습니다. en.wikipedia.org/wiki/Zero-width_space를 참조하십시오 . 이 캐릭터는 그 목적이 있지만 많은 개발자들이 그 존재를 원망합니다!
stwr667

if의 평등 검사가 실패했지만 아직 디버깅하는 동안 검사 할 때 공백이 보이지 않아서 실망했습니다.
drzounds

텍스트 파일에서 변수를로드 할 때 발생하는 일반적인 문제입니다 (예 : using fetch). 고마워
Sopalajo de Arrierez

@SopalajodeArrierez는 정확히 문자열의 끝에 공백이나 캐리지 리턴이 있습니다. 아니에요.
akelec

22

어떤이 질문에 나를 인도하는 인 paddingwhite-spaces

내 사건을 확인

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

제목은 " LastName"

여기에 이미지 설명을 입력하십시오

그래서 아마도 당신은 trim이와 같은 기능 을 사용해야 할 것입니다

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

2
감사합니다 .toString().trim(). Typescript에서 사용한
Akitha_MJ

17

강제 변환의 작동 방식을 실제로 알지 못하는 경우 대신 ==ID 연산자 ===를 사용 하지 않아야 합니다. 그러나 어떻게 작동하는지 이해하려면 이것을 읽어야합니다 .

을 사용 ==하면 언어가 어떤 유형의 강제 변환을 수행하게합니다. 예를 들면 다음과 같습니다.

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

Douglas Crockford가 그의 책에서 말한 것처럼 :

항상 ID 연산자를 사용하는 것이 좋습니다.


3
이 링크가 질문에 대한 답변을 제공 할 수 있지만 여기에 답변의 필수 부분을 포함시키고 참조 용 링크를 제공하는 것이 좋습니다. 링크 된 페이지가 변경되면 링크 전용 답변이 유효하지 않을 수 있습니다.
Parkash Kumar

{}==" "내가 준 Unexpected token ==을 할 수있는 올바른 방법을 뭐죠?
Basheer AL-MOMANI 8

12

실제로 자바 스크립트에서 문자열을 만들 수있는 두 가지 방법이 있습니다.

  1. var str = 'Javascript'; 이것은 기본 문자열 값을 만듭니다.

  2. var obj = new String('Javascript');이렇게하면 유형의 래퍼 객체가 생성 String됩니다.

    typeof str // string
    typeof obj // object

따라서 동등성을 확인하는 가장 좋은 방법은 ===연산자를 사용하는 것입니다. 연산자는 값과 두 피연산자의 유형을 모두 검사하기 때문입니다.

두 객체 사이의 동등성을 확인 String.prototype.valueOf하려면 올바른 방법 을 사용 하십시오.

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

6

트릭을 Objects사용하여 문자열을 확인할 수 있습니다 JSON.stringyfy().

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


1

두 문자열이 매우 클 수 있음을 감안하면, 2 주 접근 방식이 존재 bitwise search하고localeCompare

나는이 기능을 추천했다

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

-2

가장 쉬운 방법은 다음과 같이 삼항 연산자를 사용하는 것입니다.

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

그러나 비교하려는 문자열이 배열에 있으면 es6 필터를 사용합니다

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

위는 stringArray와 배열에서 일치하는 문자열을 확인합니다.이 경우 "boys"를 선택했습니다.


-8

테스트하는 동안 대체 솔루션을 생각해 냈습니다. 문자열 프로토 타입에서 함수를 사용할 수 있습니다.

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

크롬 브라우저에서 잘 작동합니다


이 질문은 "hello world"가 문자열인지 확인하는 방법이 아니라 "hello world"= "hello world"인지 확인하는 방법을 묻습니다.
Nick

4
이것은 단지 바보입니다. Rube Goldberg 버전의을 (를) 만들었습니다 ==.
JJJ

안녕 OP, 당신의 편집은 영적인 부분에서 완전히 다르며, 당신의 대답은 이미 너무 많은 다운 보트를 얻었습니다. 이 답변을 삭제하고 편집 된 버전으로 새 답변을 게시 해주십시오.
Yılmaz Durmaz
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.