[javascript] JavaScript에서 “0”이 false 인 이유는 있지만 ‘if’로 테스트 할 때 자체적으로 false가 아닌 이유는 무엇입니까?

다음은 "0"Javascript에서 잘못된 것을 보여줍니다 .

>>> "0" == false
true

>>> false == "0"
true

그렇다면 다음은 왜 인쇄 "ha"됩니까?

>>> if ("0") console.log("ha")
ha



답변

그 이유는 명시 적으로 할 때 "0" == false양쪽이 숫자로 변환 된 다음 비교가 수행 되기 때문 입니다.

할 때 : if ("0") console.log("ha")문자열 값을 테스트합니다. 비어 있지 않은 문자열입니다 true빈 문자열 인 반면, false.

같음 (==)

두 피연산자가 같은 유형아닌 경우 JavaScript는 피연산자를 변환 한 다음 엄격한 비교를 적용합니다. 피연산자 중 하나가 숫자이거나 부울 인 경우 피연산자는 가능한 경우 숫자로 변환됩니다. 그렇지 않으면 피연산자 중 하나가 string 이면 다른 피연산자는 가능한 경우 문자열로 변환됩니다. 두 피연산자가 모두 객체 인 경우 , JavaScript는 피연산자가 메모리에서 동일한 객체를 참조 할 때 동일한 내부 참조를 비교합니다.

( Mozilla Developer Network의 비교 연산자 에서)


답변

문제를 표시하는 표 :

진실한 진술

그리고 ==
자바 스크립트에서 모든 객체 유형의 진실한 비교

이야기 사용의 도덕 ===
온전함을 나타내는 엄격한 평등

테이블 생성 크레딧 : https://github.com/dorey/JavaScript-Equality-Table


답변

사양에 따릅니다.

12.5 if 문
.....

2. ToBoolean (GetValue (exprRef))이 true이면
ㅏ. 첫 번째 진술을 평가 한 결과를 반환하십시오.
3. 그렇지 않으면
....

사양에 따라 ToBoolean은

추상 작업 ToBoolean은 인수를 표 11에 따라 Boolean 유형의 값으로 변환합니다.

그리고 그 테이블은 문자열에 대해 이것을 말합니다 :

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

인수가 빈 문자열 (길이가 0) 인 경우 결과는 false입니다. 그렇지 않으면 결과는 사실이다

이제 "0" == false평등 연산자를 읽어야 하는 이유를 설명하기 위해 추상 연산에서 값을 가져 오는 GetValue(lref)오른쪽과 동일합니다.

이 관련 부분을 다음과 같이 설명합니다.

IsPropertyReference (V)이면
ㅏ. HasPrimitiveBase (V)가 false 인 경우 기본 [[Get]] 내부 메소드가되도록하고 그렇지 않으면 get
아래에 정의 된 특별한 [[Get]] 내부 메소드 여야합니다.
비. base를이 값으로 사용하여 get internal 메소드를 호출하고 전달한 결과를 리턴합니다.
인수에 대한 GetReferencedName (V)

즉, 문자열에는 기본 getbase가 있는데,이 함수는 내부 get 메소드를 호출하고 false로 보입니다.

GetValue 연산 use를 사용하여 사물 ==을 평가하려면 ToBoolean을 사용 하여 평가하려는 경우 ===( “strict”항등 연산자라고도 함)


답변

문자열 "0"이 거짓 인 PHP입니다 (거짓 사용시 부울 컨텍스트). JavaScript에서 비어 있지 않은 모든 문자열은 진실입니다.

트릭은 ==부울에 대해 부울 컨텍스트에서 평가하지 않고 숫자로 변환하고 문자열의 경우 10 진수로 구문 분석하여 수행되는 것입니다. 그래서 당신 0은 진실 부울 대신 숫자를 얻습니다 true.

이것은 언어 디자인이 실제로 좋지 않은 부분이며 불행한 ==연산자 를 사용하지 않는 이유 중 하나입니다 . ===대신 사용하십시오 .


답변

// I usually do this:

x = "0" ;

if (!!+x) console.log('I am true');
else      console.log('I am false');

// Essentially converting string to integer and then boolean.


답변

주위에 당신의 따옴표 0 는 문자열로 만들어 , 이는 사실로 평가됩니다.

따옴표를 제거하면 작동합니다.

if (0) console.log("ha") 


답변

ECMA 사양 "0" == false때문입니다 … 여기에 지정된 규칙 때문에 http://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3 … 여기에 지정된 규칙 if ('0')때문에 true로 평가됩니다 http : / /ecma262-5.com/ELS5_HTML.htm#Section_12.5