[javascript] JavaScript의 모든 잘못된 값

무엇 falsey ‘입니다 자바 스크립트의 값은 그들이 같은 표현식에서 거짓으로 평가하는 것이 의미 if(value), value ?그리고 !value?


있다 이미 스택 오버플로 falsey 값의 목적의 일부 논의 하지만, 모든 falsey 값이 무엇인지 목록을 더 철저한 완전한 답변은.

MDN JavaScript Reference 에서 완전한 목록을 찾을 수 없었고 JavaScript 에서 완전하고 신뢰할 수있는 잘못된 값의 목록을 찾을 때 최고의 결과가 블로그 기사였으며, 그 중 일부는 명백히 생략되었습니다. NaN), 스택 오버플로와 같은 형식은 없었습니다. 그래서 하나 만드는 것이 합리적이었습니다.



답변

JavaScript의 Falsey 값

“Falsey”는 단순히 JavaScript의 내부 ToBoolean함수 가을 반환 한다는 의미입니다 false. ToBoolean의 기초 !value, value ? ... : ...;if (value). 여기의의 공식 사양 (2020 작업 초안) (만 허용 이후 변경 1997 년 최초의 ECMA 스크립트 사양 의 추가입니다 ES6의 기호 항상 truthy있다, 그리고 BigInt, 위에서 언급 한 :

정의되지 않음 : false를 반환합니다.  Null : 거짓을 반환합니다.  부울 : 인수를 반환합니다.  숫자 : 인수가 +0, -0 또는 NaN이면 false를 리턴합니다.  그렇지 않으면 true를 반환합니다.  문자열 : 인수가 빈 문자열이면 (길이가 0이면) false를 반환합니다.  그렇지 않으면 true를 반환합니다.  BigInt : 인수가 0n이면 false를 리턴합니다.  그렇지 않으면 true를 반환합니다.  기호 : true를 반환합니다.  객체 : true를 반환합니다.


==(느슨한 평등) 과의 비교

falsy 값 ‘에 대해 이야기 그것의 가치 와 느슨한 비교== 용도 ToNumber()인해 기본 차이로 약간의 혼동을 일으킬 수. 그들은 효과적으로 세 그룹을 형성합니다 :

  • false, 0, -0, "", '' 모두와 서로 일치 ==
    • 예를 들어 false == "", '' == 0따라서4/2 - 2 == 'some string'.slice(11);
  • null, undefined ~와 일치하다 ==
    • 예를 들어 null == undefined있지만,undefined != false
    • 그것은 동안 것 또한 언급 할만큼 가치의 typeof null반환 'object', null이다 이 오랜 버그 / 특질이며, 객체가 아닌 호환성을 유지하기 위해 고정되지 않았습니다. 실제 객체가 아니며 객체가 진실합니다 ( document.allJavascript가 HTML로 구현 될 때 “고의 위반”제외 )
  • NaN 자체 와도 일치하지 않는 ==또는===
    • 예를 들어 NaN != NaN, NaN !== NaN, NaN != false,NaN != null

“엄격한 평등”( ===)을 사용하면 이러한 그룹이 없습니다. 만 false === false.

이것은 많은 개발자와 많은 스타일 가이드 (예 : standardjs )가 선호 ===하고 거의 사용하지 않는 이유 중 하나입니다 ==.


실제로 참 가치 == false

“진실”은 단순히 JavaScript의 내부 ToBoolean함수 가을 반환 한다는 것을 의미 합니다 true. 자바 스크립트의 특질은 알고 있어야합니다 (다른 좋은 이유가 선호 ===이상 ==) : 그것은 가능하다 값이 (truthy 수에 대한 ToBoolean반환 true도), 그러나 == false.

if (value && value == false) alert('Huh?')일어날 수없는 논리적 불가능 이라고 생각할 수도 있지만 다음과 같은 경우에는 그렇게 될 것입니다.

  • "0"그리고 '0'-그들은 비어 있지 않은 문자열입니다. 진실하지만 Javascript ==는 숫자가 동등한 문자열 (예 🙂 과 일치합니다 42 == "42". 이후 0 == false하다면 "0" == 0, "0" == false.
  • new Number(0)그리고 new Boolean(false)-그들은 진실한 물건이지만 ==그들의 가치를 본다 == false.
  • 0 .toExponential(); -수치에 상당하는 객체 0
  • 당신에게 진실한 유형으로 싸여있는 거짓 등가의 가치를주는 유사한 구조
  • [], [[]][0](감사 cloudfeet 에 대한 자바 스크립트 평등 표 링크 )

좀 더 진실한 가치

이들은 일부 사람들이 거짓을 기대할 수있는 몇 가지 가치에 불과하지만 실제로는 진실합니다.

  • -1 0이 아닌 모든 음수
  • ' ', " ", "false", 'null'모든 단지 공백있는 문자열을 포함한 비어 있지 않은 문자열
  • 에서 typeof비워지지 않은 문자열을 항상 반환합니다. 예 :

  • 모든 객체 ( document.all브라우저에서 “고의 위반”제외 ). 달리 제안 null하더라도 실제로는 객체가 아닙니다 typeof. 포함 :

    • {}
    • []
    • function(){}또는 () => {}(빈 기능을 포함한 모든 기능)
    • Error 그리고 어떤 경우 Error
    • 정규식
    • new( new Number(0)및 포함 new Boolean(false))으로 생성 된 모든 것
  • 모든 기호

true, 1, "1"[1]반환 true서로 비교 ==.


답변

비어 있지 않은 문자열 "false"을 평가하는 것을 잊지 마십시오.true


답변

@ user568458의 잘못된 값 목록에 추가하려면 다음을 수행하십시오.

  • 정수 0 외에 10 진수 0.0, 0.00 또는 0과 같은 숫자도 잘못된 값입니다.

    var myNum = 0.0;
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    위의 코드 스 니펫 인쇄 I am a falsy value

  • 마찬가지로 숫자 0의 16 진 표현은 아래 코드 스 니펫에 표시된대로 잘못된 값입니다.

    var myNum = 0x0; //hex representation of 0
    if(myNum){
        console.log('I am a truthy value');
    }
    else {
        console.log('I am a falsy value');
    }

    위의 코드 스 니펫이 다시 인쇄 I am a falsy value됩니다.


답변

주제에 추가하여 ES2020부터는 거짓 인 새로운 값을 가지게되며 BigInt 0 (0n)입니다.

0n == false // true
-0n == false // true

따라서 이제 총 7 개의 “거짓”값을 갖습니다 (위의 사용자가 JS가 아닌 DOM의 일부이므로 document.all을 포함하지 않음).


답변