检查数组是否为空或不存在。 JS

时间:2014-06-25 08:28:50

标签: javascript arrays

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

这样的东西?

if(array.length < 1 || array == undefined){
    //empty
}

1 个答案:

答案 0 :(得分:474)

您想首先检查undefined。如果你反过来这样做,如果数组未定义则会产生错误。

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

更新

这个答案得到了相当多的关注,所以我想指出,我的原始答案,更重要的是,它解决了问题中评估条件的错误顺序。从这个意义上讲,它无法解决几种情况,例如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
}

要打破它:

    不出所料,
  1. Array.isArray()检查其参数是否为数组。这会清除像nullundefined和其他任何不是数组的值 请注意,这也将消除类似于数组的对象,例如arguments对象和DOM NodeList对象。根据您的具体情况,这可能不是您之后的行为。

  2. array.length条件检查变量的length属性是否计算为truthy值。由于先前的条件已经确定我们确实正在处理数组,因此此处不需要更严格的比较,例如array.length != 0array.length !== 0

  3. 实用主义方法
    在很多情况下,上述情况可能看起来有点过分。也许您正在使用像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
    }