itsource

JavaScript에서 "0"은 false와 같지만, "if"에 의해 테스트되면 그 자체로 false가 아닌 이유는 무엇입니까?

mycopycode 2022. 9. 11. 17:36
반응형

JavaScript에서 "0"은 false와 같지만, "if"에 의해 테스트되면 그 자체로 false가 아닌 이유는 무엇입니까?

은 " " "를 나타냅니다."0"Javascript 서 입 、 false 입입 。

>>> "0" == false
true

>>> false == "0"
true

왜 글자가 인쇄되는 요?"ha"

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

문제를 표시하는 표:

truthy if 스테이트먼트

== ==javascript의 모든 객체 유형 간결한 비교

이야기의 교훈은 ===를 사용합니다.온전함을 나타내는 엄격한 평등

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

는, 으로 할 때,"0" == false, 양쪽이 수치로 변환되어 비교가 실행됩니다.

경우 : 행 when when :if ("0") console.log("ha")문자열 값이 테스트 중입니다.은 모두 " " " 입니다.true은 입니다false.

동일(==)

두 오퍼랜드의 유형이 동일하지 않은 경우 JavaScript는 오퍼랜드를 변환한 후 엄격한 비교를 적용합니다.어느 하나의 오퍼랜드가 숫자 또는 부울인 경우 오퍼랜드가 가능한 경우 숫자로 변환됩니다.그 이외의 오퍼랜드가 스트링인 경우 다른 오퍼랜드가 가능한 경우 스트링으로 변환됩니다.두 오퍼랜드가 객체일 경우 JavaScript는 오퍼랜드가 메모리 내의 동일한 객체를 참조할 때 동일한 내부 참조를 비교합니다.

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

사양대로입니다.

12.5 if 스테이트먼트.....
2. ToBoolean(GetValue(exprRef))이 참일 경우a. 첫 번째 스테이트먼트의 평가 결과를 반환합니다. 
3. 그렇지 않으면....

ToBoolean은 사양에 따르면

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

그리고 그 표는 현악기에 대해 이렇게 말하고 있다.

여기에 이미지 설명 입력

인수가 빈 문자열(길이 0)이면 결과가 false이고, 그렇지 않으면 true입니다.

그럼 이제 '왜'인지 하자면 '왜요?"0" == false 연산자는 연산자 '따라서'에서 그 수 .GetValue(lref)오른쪽과 일치합니다.

이 관련 부품은 다음과 같이 기술됩니다.

IsPropertyReference(V)의 경우a. HasPrimitiveBase(V)가 false이면 get[Get]의 내부 base 메서드가 되고 그렇지 않으면 get이 됩니다.아래에 정의된 특별한 [Get] 내부 메서드입니다. 
b. base를 이 값으로 사용하여 get internal 메서드를 호출하고 통과시킨 결과를 반환합니다.인수의 GetReferencedName(V)

즉, 문자열은 내부 get 메서드를 호출하여 false로 표시되는 원시 베이스를 가집니다.

GetValue를 합니다.==하여 ToBoolean하다, 사용하다=== ' 연산자) ('등식')

로 되어 "0"false(가치가 false-truthy입니다.자바스크립트

이란 게 ==부울은 부울 컨텍스트에서 평가되지 않고 숫자로 변환되며, 10진수로 구문 분석된 문자열의 경우에는 숫자로 변환됩니다. 숫자 ★★★★★★★★★★★★★★★★★★★★★.0 boolean이 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.

0truetrue로 .

따옴표를 삭제하면 효과가 있을 것입니다.

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

ECMA를 사용하다 "0" == falsehttp://ecma262-5.com/ELS5_HTML.htm#Section_11.9.3에 지정된 규칙 때문에...그리고.if ('0')http://ecma262-5.com/ELS5_HTML.htm#Section_12.5에서 지정한 규칙에 따라 true로 평가됩니다.

== 등가 연산자는 인수를 숫자로 변환한 후 평가합니다.따라서 문자열 0 "0"은 숫자 데이터 유형으로 변환되고 boolean 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");

String "0"은 인수와 비교되지 않으며 인수와 비교될 때까지 또는 그렇지 않을 경우 문자열은 true 값입니다.꼭 같다

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

그렇지만

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

`

한 한 한 평등을 .=== 한 불평등!==

"100" == 100

true값만 하지 않기 입니다.

"100" === 100

false 값과 이 확인됩니다.

"if"는 에 의존하지 않는합니다.여기 있는 다른 사람들이 지적한 것처럼 끈은 항상 진부하다.으로 가정한 수 ("0" == true) === trueDoug Crockford가 뛰어난 JavaScript: The Good Parts에서 말했듯이, [==가 피연산자의 유형을 강제하는 규칙]은 복잡하고 기억하기 어렵습니다.이동성의 결여는 우려할 만한 일입니다.피연산자 중 하나가 다른 피연산자와 일치하도록 입력되어 숫자 0으로 해석됩니다.숫자 0은 부울로 강제된 경우 false에 해당합니다(또는 숫자에 강제된 경우 false는 0에 해당합니다).

이것은 JavaScript가 Boolean 컨텍스트와 당신의 코드에서 유형 강제를 사용하기 때문입니다.

if ("0") 

부울 컨텍스트에서는 true로 강제됩니다.

Javascript에는 부울 컨텍스트에서 true로 강제되는 다른 truthy 값이 있으며, 따라서 if block이 다음과 같이 실행됩니다.

if (true)
if ({})
if ([])
if (42)
if ("0")
if ("false")
if (new Date())
if (-42)
if (12n)
if (3.14)
if (-3.14)
if (Infinity)
if (-Infinity)

if (x) 

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

x == false

는 internal to Number 강제(http://es5.github.com/#x9.3) 또는 오브젝트용 primitive(http://es5.github.com/#x9.1)를 사용하여 양쪽을 강제합니다.

상세한 것에 대하여는, http://javascriptweblog.wordpress.com/2011/02/07/truth-equality-and-javascript/ 를 참조해 주세요.

같은 문제가 있습니다.다음과 같이 유효한 솔루션을 찾았습니다.

이유는

    if (0) means false, if (-1, or any other number than 0) means true. following value are not truthy, null, undefined, 0, ""empty string, false, NaN

id와 같은 번호 타입을 사용하지 않는다

      if (id) {}

값이 0인 id 타입의 경우 (id) {}인 경우 사용할 수 없습니다. 왜냐하면 (0)이 false를 의미하고, 이는 true id 번호로 유효함을 의미하기 때문입니다.

따라서 ID 유형에는 다음을 사용해야 합니다.

   if ((Id !== undefined) && (Id !== null) && (Id !== "")){
                                                                                
                                                                            } else {

                                                                            }
                                                                            

다른 문자열 유형의 경우 null, 정의되지 않은 빈 문자열이 모두 false로 평가되기 때문에 (string) {}인 경우 사용할 수 있습니다.

       if (string_type_variable) { }

JS에서 "==" 기호는 변수의 유형을 확인하지 않습니다.따라서 "0" = 0 = false(JS 0 = false의 경우)"이며, 이 경우 true를 반환하지만 "==="를 사용하면 결과가 false가 됩니다.

"if"를 사용하면 다음과 같은 경우 "false"가 됩니다.

[0, false, '', null, undefined, NaN] // null = undefined, 0 = false

그렇게

if("0") = if( ("0" !== 0) && ("0" !== false) && ("0" !== "") && ("0" !== null) && ("0" !== undefined) && ("0" !== NaN) )
        = if(true && true && true && true && true && true)
        = if(true)

저는 이 문제를 해결하기 위한 해결책을 찾아 여기에 왔습니다."0"부울로 사용합니다.기술적인 부분은 위에서 설명하고 있기 때문에 자세한 내용은 설명하지 않겠습니다만, 퀵 타입의 캐스트가 해결해 주는 것을 발견했습니다.

1 ★★★★★★★★★★★★★★★★★」0PHP와 같은 부울입니다. 위의 몇 작업을 하거나 또는 을 할 수 .parseInt()들면 다음과 같습니다.

x = "0";
if(parseInt(x))
//false

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

반응형