JavaScript:空の配列、[]は条件付き構造でtrueと評価されます。どうしてこれなの?


94

次の式を期待していたため、コードで多くのバグに遭遇していました。

Boolean([]); falseと評価します。

しかし、真と評価されたため、これは当てはまりませんでした。

したがって、次の[]ように返される可能性のある関数:

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

}else
{
  // ...
}

期待したことをしませんでした。

私はと仮定で間違っています[]空の配列?

また、この動作はすべてのブラウザで一貫していますか?それともそこに何か落とし穴がありますか?ちなみに私はこの動作をGoolgle Chromeで観察しました。


5
配列はオブジェクトであり、オブジェクトは真実です。array.lengthを要求してください。ゼロでなければ、それは真実です。明示的にブール値に変換すると、配列は最初に空の文字列になり、次に空の文字列がfalseになります。
dandavis 2013年

1
使ってみませんmyCollection.length > 0か?
Steve

1
@Steve -場合は動作しませんがmyCollectionあることを起こりますnullundefined。を使用する必要がありますif(myCollection && myCollection.length > 0)
Ted Hopp 2013年

@TedHopp-もちろん... myCollection.length > 0OPが要求したことを実行しているブール値を提供することを指摘していました...彼はまだそこから作業を行う必要があります。
Steve

回答:


108

http://www.sitepoint.com/javascript-truthy-falsy/から

次の値は常に誤りです。

  • 0(ゼロ)
  • ""(空の文字列)
  • ヌル
  • 未定義
  • NaN(Not-a-Numberを意味する特別なNumber値!)

「0」(引用符で囲まれたゼロ)、「false」(引用符で囲まれたfalse)、空の関数、空の配列、空のオブジェクトなど、他のすべての値は真実です。


25
式をテストする[] == falseと、評価はになりtrueます。
m.rufca

3
m.rufcaを参照してください@ stackoverflow.com/questions/5491605/...
Barmar

==投稿したリンクにコンパレータを使用した予期しない状況を示す数少ない表があります。私は真または偽の評価を期待するときは注意するためだけにコメントしました。
m.rufca

4
これはなぜWHYなのかという質問には実際には答えません。空の文字列が偽であるときに、空の配列が真実であるのはなぜですか?意図的な設計決定として、これは非常に貧弱に感じられます。
Esa Lindqvist

1
おそらく、それらはプリミティブオブジェクトのように動作する必要があるためです。しかし、JavaScriptにはプリミティブ配列がありません。
Barmar 2018年

23

.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.