如何检查数组是否为空或不存在?

检查数组是否为空或不存在的最佳方法是什么?

像这样的东西?

if(array.length < 1 || array == undefined){
//empty
}
1033469 次浏览

首先要检查undefined。如果你反过来做,如果数组是未定义的,它会生成一个错误。

if (array === undefined || array.length == 0) {
// array does not exist or is empty
}

更新

这个答案得到了相当多的关注,所以我想指出的是,我最初的答案,比其他任何东西都更重要的是,解决了问题中评估条件的错误顺序。从这个意义上说,它无法解决一些场景,例如null值,具有length属性的其他类型的对象,等等。它也不是非常习惯的JavaScript。

< p > # EYZ0
从评论中获得一些灵感,下面是我目前认为的检查数组是否为空或不存在的简单方法。它还考虑到变量可能不是指向数组,而是指向具有length属性的其他类型的对象
if (!Array.isArray(array) || !array.length) {
// array does not exist, is not an array, or is empty
// ⇒ do not attempt to process array
}

分解一下:

  1. Array.isArray(),不出所料,检查它的参数是否为数组。这将清除像nullundefined这样的值以及任何其他不是数组的值。
    注意,这也将消除类数组对象,例如arguments对象和DOM NodeList对象。根据你的情况,这可能不是你所追求的行为

  2. array.length条件检查变量的length属性是否为< em >真相< / em >值。因为前面的条件已经确定我们确实在处理一个数组,所以这里不需要更严格的比较,如array.length != 0array.length !== 0

< p > # EYZ0
在很多情况下,上面的方法似乎有些过头了。也许你正在使用一种更高阶的语言,比如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中可选链操作符 (Elvis操作符)的引入,这可以进一步缩短:

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
}