2012-12-13 3 views

답변

9

이것은 자바 스크립트가 유형 강제 변환을 수행하는 혼란스러운 규칙 때문입니다. EcmaScript 5 사양의 §11.9.3에서이 내용을 읽을 수 있습니다. (배열도 있습니다) 동일 결코

두 개체, 첫 번째 블록 수율 거짓 (§11.9.3.1.c.vi)에 따라서 모든 비교는

두 번째 블록은 더 어렵습니다 :

가장 먼저 알아야 할 것은 ==이 타입 강제 변환을 사용하여 피연산자를 비교한다는 것입니다.

비교에 부울이 관련된 경우이 숫자는 먼저 숫자로 강제 변환됩니다.그 개체 나서 문자열이 숫자로 coereced된다 Object.prototype.toString

"" == 0 

호출하여 기본 값으로 강제 한 후

[]==false 
[]==0 

(""0된다)

0 == 0 

사실 얻었다. 동일한 규칙을 적용하면 다른 예제도 왜 사실인지 알 수 있습니다.

===은 유형 강제 변환을 발생시키지 않지만 올바른 유형을 먼저 확인하고 같지 않으면 false를 산출합니다. 유형이 동일한 경우에만 실제 값을 비교합니다. 따라서이 비교 방법은 ==보다 훨씬 안정적입니다.

+0

가장 잘 설명 된 답변, 감사합니다. – rickyduck

4

모든 예는 자바 스크립트 것 쉽게 경우에 당신이 개체를 비교하고 있다는 사실로 설명 (및 배열은 특별한 객체) 할 수 false 발생합니다 개체 참조을 비교하십시오. 모든 비교를 사용하여 새 객체를 만들 때 모든 객체가 다른 객체를 가리 키므로 결과는 false이됩니다.

[0]=='0'의 경우 : 하나의 피연산자가 문자열이되면 다른 하나는 문자열로 변환됩니다. [0]의 문자열 변환은 '0'이므로 결과가 true입니다.

마지막 두 비교 결과를 설명하는 하나의 피연산자가 숫자 또는 부울 인 경우에도 마찬가지입니다.

자세한 내용은 respective MDN page을 참조하십시오.

중요한 부분을 인용 :

같음 (==)

를 두 피연산자가 동일한 타입이 아닌 경우, 자바 스크립트는 피연산자 변환 엄격한 비교를 적용한다. 피연산자 중 하나가 숫자 또는 부울이면 가능하면 피연산자가 숫자로 변환됩니다. else 피연산자가 문자열이면 가능한 경우 다른 피연산자가 문자열로 변환됩니다. 두 피연산자가 모두 객체 인 경우 JavaScript는 피연산자가 메모리의 동일한 객체를 참조 할 때와 동일한 내부 참조를 비교합니다.

3

litteral 배열/개체 초기화를 사용하면 비어있는 경우에도 새 개체를 만들고 참조가 반환됩니다. 그래서 그것들을 비교할 때, 당신이 만든 객체의 참조 값을 비교합니다.

다른 유형의 변수를 비교 중이므로 다른 예제가 true를 반환하므로 개체/배열이 비교 될 수 있도록 변환됩니다.

관련 문제