CSSrain으로 컴파일된 테스트 질문 세트에는 다음과 같은 질문이 있습니다.
<SCRIPT LANGUAGE="자바스크립트">
var a = 0;
var b = -1;
var c = 1;
함수 주장(aVar) {
if (aVar==true) 경고(true);
그렇지 않으면 경고(false);
}
주장(a);
주장(b);
주장(c);
</SCRIPT>
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
내 이해에 따르면 0이 아닌 모든 부울 값은 참이어야 합니다.
하지만 이 질문의 올바른 결과는 false false true입니다.
(-1==true) 값은 false입니다.
다음 예를 살펴보겠습니다.
<SCRIPT LANGUAGE="자바스크립트">
var a = 0;
var b = -1;
var c = 1;
함수 주장(aVar) {
if (aVar) 경고(true);
그렇지 않으면 경고(false);
}
주장(a);
주장(b);
주장(c);
</SCRIPT>
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
실행 결과는 false, true, true입니다.
여기서는 if(aVar)와 if(aVar == true)의 결과가 동일하지 않음을 알 수 있습니다.
답변 에서 CSSrain의 설명은 다음과 같습니다.
if(aVar) 및 if(aVar==true)는 음수에 대해 매우 다른 답변을 갖습니다.
정말 음수가 나오는 이유인가요? 다음 예를 고려하십시오.
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
양수 2도 false를 반환하는 이유는 무엇입니까? 숫자를 부울 값으로 변환하고 살펴보겠습니다.
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
여기서 0이 아닌 부울 값은 실제로 true입니다. 이는 모든 문제가 2==true의 == 연산자에 초점을 맞춘다는 것을 의미합니다. 기본적으로 ==는 숫자를 부울 값으로 변환한 다음 비교해서는 안 된다는 것이 확실합니다.
ECMA-262(80페이지)에서 말하는 내용을 살펴보세요.
6. Type(x)가 Boolean인 경우 비교 결과를 ToNumber(x) == y로 반환합니다.
7. Type(y)가 Boolean인 경우 x == ToNumber(y) 비교 결과를 반환합니다.
즉, 부울 값을 먼저 숫자로 변환한 후 비교합니다. true의 숫자 값은 1이고 false는 0입니다. 따라서 2와 -1 중 어느 것도 참이 될 수 없습니다.
다음 예를 자세히 살펴보십시오.
<SCRIPT LANGUAGE="자바스크립트">
var a = "정의되지 않음";
var b = "거짓";
var c = "";
함수 주장(aVar) {
if (aVar==true) 경고(true);
그렇지 않으면 경고(false);
}
주장(a);
주장(b);
주장(c);
</SCRIPT>
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
이전 아이디어에 따르면 true는 1로 변환되므로 세 문 모두 false를 반환합니다. 그것을 실행하고 그것이 실제로 사실인지 확인하십시오.
다음으로 if(aVar==true)를 if(aVar)로 변경합니다.
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
이때 실행 결과는 true, true, false입니다. Boolean("undefine"), Boolean("false"), Boolean("")의 결과는 true, true, false이기 때문입니다. 비어 있지 않은 문자열은 부울 true로 변환됩니다.
마지막으로 ==의 양쪽이 문자열과 숫자인 경우의 비교 규칙을 설명하는 예가 있습니다.
코드 상자 실행
[Ctrl+A 모든 팁 선택: 먼저 코드의 일부를 수정한 후 실행을 누를 수 있습니다.]
이 "001"==true가 사실이라는 것을 알았습니까?
true가 먼저 1로 변환되기 때문입니다. 그런 다음 ECMA의 규칙을 참조하세요.
4. Type(x)가 숫자이고 Type(y)가 문자열인 경우 x == ToNumber(y) 비교 결과를 반환합니다.
5. Type(x)가 문자열이고 Type(y)가 숫자인 경우 비교 결과를 ToNumber(x) == y로 반환합니다.
문자열을 숫자로 변환하고 Number("001")의 값도 1이므로 결과는 true입니다.