JavaScript의 모든 잘못된 값


215

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


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

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




5
dorey.github.io/JavaScript-Equality-Table 은 훌륭한 자료이며 if()진실성에 대한 탭이 있습니다.
cloudfeet

4
와, 정말 유용합니다, 감사합니다! [[]] == ""하지만 [] != []? 내 머리가 아프다.
user56reinstatemonica8

ECMA 262 사양에는 이러한 비교 규칙, 특히 11.9.1 ~ 11.9.6 절이 자세히 설명되어 있습니다. ecma-international.org/ecma-262/5.1/#sec-11.9.3 이 참조를 포함하도록 답변을 업데이트하면 팽창 할 것입니다 이는 참 / 거짓 결정이 이루어지는 방식에 대한 규칙을 제공하기 때문입니다.
Shaun Wilson

답변:


367

JavaScript의 Falsey 값

  • false
  • 제로 Number유형 : 0-0, 0.0그리고 진수 양식 0x0( 감사 RBT )
  • BigInt유형의 제로 : 0n-0n(2020의 새로운 기능, GetMeARemoteJob 덕분에 )
  • "", ''``- 길이의 문자열을 0
  • null
  • undefined
  • NaN
  • document.all (HTML 브라우저에서만)

"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서로 비교 ==.


3
참고로, 무엇을 !, if그리고 ?..:공통점은 내부 호출이다 ToBoolean가치에 기능을. 그 값의 맥락에서 어떻게 행동하는지 !, if등 이미 이름이 암시 : 그들은 "falsy"값입니다. 나는 다른 사람들이 답을 읽고 생각하는 것을 조금 무서워 "아 그래서 이러한 맥락 (에 !, if, ?...:), 값이 false있지만 함께 !!, 그건 true" 하지만 기본 개념을 이해하지 않습니다. 다른 두 가지 요점 : 1)의 v ? true : false간단한 방법입니다 !!v. 2) typeof 항상 비어 있지 않은 문자열을 반환합니다.
Felix Kling

1
즉, 구체적 으로 typeof null보거나 볼 필요가 없습니다 typeof undefined. 비어 있지 않은 문자열은 진실하다고 말할 수 있습니다.
Felix Kling

1
나는 알지만 이것은 원래의 질문과는 아무런 관련이 없습니다.
Felix Kling

5
나는 그것이 document.all거짓 이라는 것을 배웠다 .
Claudiu

3
느슨한 비교에 관해서 : 부울은 숫자로 변환되기 때문에 와는 매우 다른 것을 x == false호출 합니다. 설명 할 가치가 있습니다. 또한 나는 방금 전에이 답변에 댓글을 달았습니다. :ToNumber(x)ToBoolean(x)
Felix Kling

3

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


8
… 따라서 까다로운 가치가 아닌가?
Bergi

5
터치 그것은 당신이 거짓으로 예상 할 수있는 가치이며, 아직까지도 알고있을만한 가치가 있다고 생각합니다. 그리고 종합적인 목록에서 언급 할 가치가 있다고 생각합니다
MrMcPlad

4
목록에 추가되었지만 ...이 모든 가능한 진실한 값의 포괄적 인 목록으로 바꾸려고하지 마십시오! 시간이 :-)
좀 걸렸습니다

3

@ 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됩니다.


7
JavaScript에는 정수가 없습니다. 0, 0x0, 0.00.00같은 IEEE-754 64- 비트 부동 소수점 값의 제로 단지 다른 리터이다.
fredoverflow

1

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

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

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


1
좋은! 고마워, 나는 그것에 대해 아직 듣지 못했다, 나는 그것을 높이는 것에 대한 답변을 제공하는 링크와 함께 그것을 큰 목록에 추가했다
user56reinstatemonica8
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.