配列が空か存在しないかを確認する最良の方法は何ですか?
このようなもの?
if(array.length < 1 || array == undefined){
//empty
}
ベストアンサー1
最初にチェックを行う必要がありますundefined
。逆の順序で行うと、配列が未定義の場合にエラーが発生します。
if (array === undefined || array.length == 0) {
// array does not exist or is empty
}
アップデート
この回答はかなりの注目を集めていますので、私の最初の回答は、何よりも、質問で評価される条件の順序が間違っていたことを指摘したいと思います。この意味で、null
値、プロパティを持つ他のタイプのオブジェクトなど、いくつかのシナリオに対応できていませんlength
。また、あまり慣用的な JavaScript でもありません。
確実なアプローチ
コメントからヒントを得て、配列が空か存在しないかをチェックする確実な方法として私が現在考えているものを以下に示します。また、変数が配列ではなく、プロパティを持つ他のタイプのオブジェクトを参照している可能性も考慮に入れていますlength
。
if (!Array.isArray(array) || !array.length) {
// array does not exist, is not an array, or is empty
// ⇒ do not attempt to process array
}
詳しく見てみましょう:
Array.isArray()
は当然ながら、引数が配列かどうかをチェックします。これにより、 などの値やnull
、undefined
配列ではないその他のものが除去されます。これにより、 などの配列のようなオブジェクト
も除去されることに注意してください。arguments
オブジェクトとDOMNodeList
オブジェクト。状況によっては、これが目的の動作ではない可能性があります。条件
array.length
は、変数のlength
プロパティが真実の値。前の条件で配列を扱っていることがすでにわかっているので、array.length != 0
またはのようなより厳密な比較はarray.length !== 0
ここでは必要ありません。
実用的なアプローチ
多くの場合、上記はやり過ぎのように思えるかもしれません。コンパイル時にほとんどの型チェックを行う TypeScript などの高階言語を使用している場合や、オブジェクトが実際に配列であるか、単に配列のようなものであるかを気にしない場合などです。
そのような場合、私は次のような、より慣用的な JavaScript を選択する傾向があります。
if (!array || !array.length) {
// array or array.length are falsy
// ⇒ do not attempt to process array
}
あるいは、より一般的にはその逆です。
if (array && array.length) {
// array and array.length are truthy
// ⇒ probably OK to process array
}
の導入により、オプションの連鎖演算子(エルビス演算子) ECMAScript 2020 では、これをさらに短縮できます。
if (!array?.length) {
// array or array.length are falsy
// ⇒ do not attempt to process array
}
またはその逆:
if (array?.length) {
// array and array.length are truthy
// ⇒ probably OK to process array
}