IT story

JavaScript에서 "0"이 false 인 이유는 있지만 'if'로 테스트 할 때 자체적으로 false가 아닌 이유는 무엇입니까?

hot-time 2020. 4. 23. 08:01
반응형

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


"if"표현은 진실성을 테스트하는 반면, 이중 동등성은 타입 독립적 인 동등성을 테스트합니다. 다른 사람들이 지적했듯이 끈은 항상 진실합니다. 이중 동일성이 두 피연산자 모두에 대해 진실성을 테스트 한 다음 결과를 비교하는 경우 직관적으로 가정 한 결과를 얻을 수 있습니다 ("0" == true) === true. Doug Crockford가 자신의 뛰어난 JavaScript 에서 " 좋은 부분 (Good Parts )"에서 "[== 피연산자의 유형을 강제하는] 규칙은 복잡하고 잊을 수없는 규칙입니다 .... 피연산자 중 하나가 다른 피연산자와 일치하도록 유형 강제되어 있고 "0"은 숫자 0으로 해석된다고 말하면 충분합니다.


== 같음 연산자는 인수를 숫자로 변환 한 후 평가합니다. 문자열 제로 "0"Number 데이터 유형 및 부울 false로 변환되고, 그래서 번호 0으로 변환되고, 그래서

"0" == false // true

`에도 동일하게 적용됩니다.

false == "0" //true

=== 엄격한 동등성 검사는 원래 데이터 유형의 인수를 평가합니다.

"0" === false // false, because "0" is a string and false is boolean

동일

false === "0" // false

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

문자열 "0"은 (는) 인수와 비교하지 않으며 문자열은 인수와 비교할 때까지 또는 그렇지 않으면 실제 값입니다. 정확히 같다

if(true) console.log("ha");

그러나

if (0) console.log("ha"); // empty console line, because 0 is false

`


if (x) 

JavaScript의 내부 toBoolean (http://es5.github.com/#x9.2)을 사용하여 x를 강제 변환

x == false

내부 toNumber 강제 변환 (http://es5.github.com/#x9.3) 또는 객체 기본 제한 (http://es5.github.com/#x9.1)을 사용하여 양면 강제

자세한 내용은 http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/를 참조하십시오.

참고 : https://stackoverflow.com/questions/7615214/in-javascript-why-is-0-equal-to-false-but-when-tested-by-if-it-is-not-fals

반응형