JavaScript : 빈 배열, []는 조건부 구조에서 true로 평가됩니다. 왜 이런거야?


99

이 식을 예상했기 때문에 코드에서 많은 버그가 발생했습니다.

Boolean([]); 거짓으로 평가합니다.

그러나 이것은 사실로 평가 되었기 때문에 그렇지 않았습니다.

따라서 []다음과 같이 반환 될 수있는 함수 :

// Where myCollection possibly returned [ obj1, obj2, obj3] or []
if(myCollection)
{
  // ...

}else
{
  // ...
}

예상 한 일을하지 않았습니다.

내가 []빈 배열 이라고 잘못 생각하고 있습니까?

또한이 동작이 모든 브라우저에서 일관됩니까? 아니면 거기에도 문제가 있습니까? 그런데 Goolgle Chrome에서이 동작을 관찰했습니다.


5
배열은 객체이고 객체는 진실입니다. 0이 아니라면 array.length를 요청하십시오. 명시 적으로 부울로 변환하면 배열이 먼저 빈 문자열로 바뀌고 빈 문자열이 거짓으로 바뀝니다.
dandavis 2013 년

1
왜 사용하지 myCollection.length > 0않습니까?
Steve

1
@ 스티브 - 경우에 해당하지 않습니다 작동 myCollection될 일이 nullundefined. 을 사용해야 if(myCollection && myCollection.length > 0)합니다.
Ted Hopp 2013 년

@TedHopp-물론 ... myCollection.length > 0OP가 요청한 것을 수행하는 부울 값 을 제공하는 것을 지적했습니다 ... 그는 여전히 거기에서 작업을 수행해야합니다.
Steve

답변:


118

에서 http://www.sitepoint.com/javascript-truthy-falsy/

다음 값은 항상 거짓입니다.

  • 그릇된
  • 0 (영)
  • ""(빈 문자열)
  • 없는
  • 찾으시는 주소가 없습니다
  • NaN (Not-a-Number!를 의미하는 특수 숫자 값)

"0"(따옴표로 묶인 0), "false"(따옴표로 묶인 false), 빈 함수, 빈 배열 및 빈 개체를 포함한 다른 모든 값은 진실입니다.

이것이 왜 그런지에 관해서 는 JavaScript 배열이 특정 유형의 객체이기 때문이라고 생각합니다. 배열을 특별히 처리하려면 테스트에 추가 오버 헤드가 필요합니다 Array.isArray(). 또한이 컨텍스트에서 실제 배열이 다른 배열과 같은 객체와 다르게 작동하면 혼란 스러울 수 있지만 모든 배열과 유사한 객체를 동일하게 작동하게 만드는 것은 훨씬 더 비쌉니다.


27
당신이 표현을 테스트하는 경우 [] == false는 평가 true.
m.rufca 2018


==게시 한 링크에 비교기를 사용하여 예상치 못한 상황을 보여주는 몇 가지 테이블이 있습니다. 나는 진실 또는 거짓 평가를 기대할 때 조심하기 위해 언급했다.
m.rufca

4
이것은 왜 질문에 대한 답이 아닙니다. 빈 문자열이 거짓 일 때 왜 빈 배열이 진실입니까? 의도적 인 디자인 결정으로 이것은 매우 나쁘다고 느낍니다.
Esa Lindqvist

1
아마도 그것들은 원시 객체처럼 작동해야하기 때문일 것입니다. 그러나 Javascript에는 기본 배열이 없습니다.
Barmar

28

.length요소가 포함되어 있는지 확인하려면 해당 배열 의을 확인해야합니다 .

if (myCollection) // always true
if (myCollection.length) // always true when array has elements
if (myCollection.length === 0) // same as is_empty(myCollection)

@marczellm Steve의 코멘트는 구식입니다. 그는 DevIshOne에 "배열에 요소가있을 때" 라는 누락 된 조건에 대해 알 렸습니다 . 따라서 편집 에서 수정되었습니다 .
mucaho
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.