2011-08-19 6 views
1

jQuery 및 jQuery URL 플러그인 사용.JavaScript 문자열이 올바르게 평가되지 않습니까?

$('#secondary-nav > li > ul > li > a').each(function() { 
    var aHref = new String($(this).attr('href')); 
    alert (aHref); 
    var wUrl = new String($.url().attr('file')); 
    alert (wUrl); 
    alert (aHref === wUrl); 
}); 

이 AHREF 및 wUrl 모두 (내가 instanceof를 사용하여 확인했습니다) 문자열 객체 :

나는 다음과 같은 코드가 있습니다. 그러나 비교는 거짓으로 돌아옵니다. 코드는 "pageA.html"에 있고 앵커의 href 중 하나는 "pageA.html"이지만 실제로는 true로 평가되지 않습니다.

+1

=== 대신 ==를 사용하면 올바르게 비교할 수 있습니까? –

답변

6

자바 스크립트 문자열 사이에, 혼동, 구별 문자열 개체. 더욱 혼란스럽게도, 그들은 많은 맥락에서 상호 교환이 가능합니다. ===은 실제로 차이를 만드는 몇 가지 사례 중 하나입니다. 개체의 경우의 경우 === 테스트는 양측이 인 경우 동일한 특정 생성자 호출에 의해 생성 된 개체를 테스트합니다. 반면에 문자열 값은입니다.

new String(...)을 사용하면 생성자에 입력 한 값에서 실제 문자열 개체을 명시 적으로 요청합니다. 즉, 나중에 비교할 때 ===이라는 엄밀한 의미를 가짐을 의미합니다.

문제를 해결하려면 코드에서 new String을 간단히 생략하십시오.

+0

+1,''foo "=== 새로운 문자열 ("foo ")'을 시도하면 결과는'false' (혼란스럽게)가되어야합니다. – maerics

+0

해명 해줘서 고마워,하지만 내 부분에 그냥 바보 오타 였어 알아 냈어. – jkinz

2

새 String 객체를 만들 필요가 없습니다. 단순히 var aHref = $(this).attr('href');으로 바꿀 수 있습니다. 간단한 문자열을 비교할 수있는 것처럼 객체를 쉽게 비교할 수 없습니다. 새 객체를 만들지 않으면 aHref === wUrltrue으로 평가됩니다.

개체를 비교할 때 대개 같은 유형으로 변환됩니다 (대부분 문자열의 경우 (문자열과 int 등 비교)). 그러나 둘 다 동일한 유형 (사용자의 경우 String) 인 경우 비교되지 않습니다 단순한 문자열이지만 객체는 다른 객체입니다. 이것은 객체를 참조하는 변수가 특정 객체 인스턴스 (다른 언어의 포인터와 같은 종류)를 참조하기 때문입니다. 두 개의 별개의 객체를 다루고 있기 때문에 (이들은 동일한 인자를 가질 수 있지만 여전히 메모리에 별도로 위치 함), =====은 모두 false으로 평가됩니다. 또한 aHref.toString() === wUrl.toString()은 처음에는 간단한 문자열로 변환되기 때문에 true으로 평가됩니다.이 경우 단순한 문자열로 변환되기 때문에 개체를 나타내지는 않지만 문자열로 표현됩니다.

0

사용 : alert (aHref == wUrl);TYPE을 비교하지 않습니다. 또는 문자열을 강제 할 수 있습니다.

(aHref+'' === wUrl+'') 
0

예를 들어 aHref와 wUrl을 게시 할 수 있습니까? 문자열이

2

것은 그들이 실제로 같은 객체 있습니다 있는지 볼 것이다 자바 스크립트 두 개체를 비교 엄격하게 동일 (같은 순서로 문자의 즉, 동일한 수의) 경우

===는 true를 돌려줍니다 , 그들이 똑같이 보이지 않는 한. 따라서 {foo:'bar'} == {foo:'bar'}false으로 평가됩니다.

문자열을 값으로 비교하려면 문자열 기본 문자 var aHref = $(this).attr('href') & var wUrl = $.url().attr('file')을 사용해야합니다.


어떤 이상한 이유로, 당신은 문자열 생성자로 문자열을 만드는 방법에 대한 주장, 경우에, 당신은 원시로 강요 할 수

alert (aHref.toString() === wUrl.toString()); 
관련 문제