2014-11-12 2 views
6

코드 검토를 진행할 예정이며 대소 문자를 무시하면서 비교하려고 할 때 JavaScript에서 문자열을 대문자 또는 소문자로 변환하는 것이 더 나은지 궁금합니다.JavaScript에서 toLowerCase 또는 toUpperCase를 사용하여 문자열을 비교하는 것이 더 좋습니까?

사소한 예 :

var firstString = "I might be A different CASE"; 
var secondString = "i might be a different case"; 
var areStringsEqual = firstString.toLowerCase() === secondString.toLowerCase(); 

또는 나는이 작업을 수행해야합니다

그것은 하나 또는, 영어 문자와 같은 제한된 문자 세트로 작업 것 "해야한다"그것 때문에 한 번 더 같이 보인다
var firstString = "I might be A different CASE"; 
var secondString = "i might be a different case"; 
var areStringsEqual = firstString.toUpperCase() === secondString.toUpperCase(); 

다른 것보다 튼튼한가?

참고로

, MSDN 대문자로 정상화 문자열을 권장하지만 관리되는 코드입니다 (아마도 C# & F 번호하지만 그들은 화려한 StringComparers 및 기본 라이브러리가) : 그대로 그것은 결코 브라우저에 의존하지 http://msdn.microsoft.com/en-us/library/bb386042.aspx

+0

대부분의 문자열에는 소문자가 더 많이 포함될 것이므로 적어도 소문자로 변환하는 것은 처리 할 문자가 적지 만 다른 문자는 처리하지 않을 것입니다. 차이점이 있습니까? –

+1

JavaScript에서 다른 점이 있는지 확실하지 않은 경우 MSDN 링크에서 왕복을 할 수없는 문자가 있음을 나타냅니다. "문자열은 대문자로 표준화되어야합니다. 왕복 여행을 할 수없는 것은 문자를 한 로케일에서 다른 로케일로 변환 한 다음 변환 된 문자에서 정확하게 원래 문자를 검색하는 것을 의미합니다. " - .Net에 고유 한 것이거나 모든/대부분의 프로그래밍 언어에 적용되는지 확실하지 않습니다. –

+1

브라우저의 의존성에 따라 브라우저에서 내부적으로 두 가지 방법이 어떻게 작동하는지 추측 할 수 있습니다. 그러나 둘 다 문자를 반복하여 검사하고 변환하므로 문제가되지 않습니다. 실생활에서, 그것은 중요하지 않습니다. – adeneo

답변

9

수정 된 답변

이 질문에 답한 것은 꽤 오래되었습니다. 문화적 이슈가 여전히 사실이지만 (나는 그들이 멀리 떠날 것이라고 생각하지 않는다), ECMA-402 표준의 개발은 구식의 답변을 만들었다. !

var locale = 'en'; // that should be somehow detected and passed on to JS 
var firstString = "I might be A different CASE"; 
var secondString = "i might be a different case"; 
if (firstString.localeCompare(secondString, locale, {sensitivity: 'accent'}) === 0) { 
    // do something when equal 
} 

이 두 개의 문자열을 대소 문자를 구분하지만, 악센트에 민감한를 비교합니다 (예를 들어 A = A :

지역화 된 문자열을 비교하기위한 가장 좋은 방법은 적절한 로케일과 옵션 기능 toLocaleCompare()을 사용하는 것으로 보인다). 이 성능상의 이유로 충분하지 않으면
, 당신은 매개 변수로 로케일을 통과 toLocaleUpperCase() 또는 toLocaleLowerCase() 중 하나를 사용할 수 있습니다 : 이론적으로

if (firstString.toLocaleUpperCase(locale) === secondString.toLocaleUpperCase(locale)) { 
    // do something when equal 
} 

는 차이가있을 수 없습니다. 당신이 정말로 Internationalization (국제화)에서이 질문을 의미하는 경우 연습, 미묘한 구현 세부 사항 (또는 지정된 브라우저에서 구현의 부족) 다른 결과를 얻을 수 있습니다 ...

원래 대답

에서 나는 확실하지 않다 태그를 사용했지만 이후에 ...
아마도 가장 예기치 않은 대답은 아니요입니다.

대소 문자 변환을 사용하는 경우 tons of problems이 있습니다. 자바 스크립트의 경우와 같이 언어를 나타내지 않고 대소 문자를 변환하려는 경우 필연적으로 기능적 문제가 발생합니다. 예 :

  1. 대문자와 소문자의 개념이없는 많은 자연어가 있습니다. 그것들을 변환하려고 시도 할 때 아무런 의미가 없다.
  2. 문자열 변환에 대한 언어 별 규칙이 있습니다. 독일어 sharp S 문자 (ß)는 두 개의 대문자 S 문자 (SS)로 변환되도록 바인딩됩니다.
  3. 터키어와 아제르바이잔 어 (또는 원하는 경우 Azeri)는 "매우 이상 함"concept of two i characters : 점이없는 ı (대문자 I로 변환 됨)와 점선으로 된 i (대문자로 변환 함) < -이 글꼴은 올바른 표현을 허용하지 않지만 이것은 정말로 다른 글리프입니다.)
  4. 그리스어에는 많은 "이상한"변환 규칙이 있습니다. 한 가지 특별한 규칙은 대문자 sigma (Σ)을 말합니다. 단어의 위치에 따라 규칙적인 σ (σ)와 최종 σ (σ)의 두 소문자가 있습니다. "악센트 부호"문자와 관련하여 다른 변환 규칙이 있지만 변환 함수 구현 중에는 일반적으로 생략됩니다.
  5. 일부 언어 has title-case letters 즉 Lj는 LJ 또는 덜 적절하게 LJ로 변환되어야합니다. 동일한 것은 ligatures과 관련이 있습니다.
  6. 마지막으로 많은 숫자가 compatibility characters인데, 이는 비교하려고하는 것과 같은 것을 의미 할 수 있지만 완전히 다른 문자로 구성 될 수 있습니다. 그것을 악화시키기 위해, "ae"와 같은 것들은 독일어와 핀란드어에서는 "ä"와 같을 수 있지만 덴마크어에서는 "æ"와 같은 것입니다.

사용자 입력을 글자 그대로 비교하는 것이 아니라 글자를 직접 비교하는 것이 좋습니다. 사용자와 관련이 없다면 문제가되지 않지만 대소 문자 변환에는 항상 시간이 걸립니다. 왜 귀찮아?

1

을 참여하고있는 자바 스크립트 만. 두 문자의 아니오 (튀기는 경우)

var areStringsEqual = firstString.toLowerCase() === secondString.toLowerCase(); 
var areStringsEqual = firstString.toUpperCase() === secondString.toUpperCase(); 

당신은 당신이 브라우저에 의존 느낀다,하지만 같은 몇 가지 다른 테스트 입력을 할 수 @adeneo에 의해 준비 테스트를 사용하는 경우 "로 변경 될 필요에 따라 성능을 제공합니다 AAAAAAAAAAAAAAAAAAAAAAAAAAAA "&"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "라고 비교하십시오.

자바 스크립트 성능은 일부 DOM API 또는 DOM 조작/상호 작용이있는 경우 브라우저에 따라 다르며 그렇지 않은 경우 일반 자바 스크립트의 경우 동일한 성능을 제공합니다.