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

726

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

类似于这样吗?

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

20
你可以通过以下方式简单地实现: 如果(数组 && 数组.length){//做一些事情} 这是更简洁的一种方式。 - Kamran
3
与此问题不同的是,相关问题是如何确保创建一个与此数组不同的数组,而这个问题则是询问如何判断一个数组不存在或为空。 - Edward Brey
@EdwardBrey 是的,但这对我没有帮助,我不想创建它,也许我不确定如何从那些答案中删除创建部分... - Claudiu Creanga
1个回答

1452

你需要首先检查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
}

把它分解开来:
  1. Array.isArray(),顾名思义,检查它的参数是否为数组。这将淘汰像nullundefined和任何不是数组的值。
    请注意,此条件还会淘汰类似数组的对象,例如arguments对象和DOM NodeList 对象。根据您的情况,这可能不是您想要的行为。

  2. array.length 条件检查变量的 length 属性是否评估为truthy 值。由于前一个条件已经确定我们确实正在处��一个数组,因此在此处不需要更严格的比较,如 array.length != 0array.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中引入了可选链操作符(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
}

14
Array 对象不是唯一具有 length 属性的对象。判断一个变量是否已定义且为数组的最简便方法如下:`if (typeof varName !== 'undefined' && Object.getPrototypeOf(Object(varName)) === Object.getPrototypeOf([])) { console.log('varName 是一个数组'); }` - Elias Van Ootegem
11
在数组长度条件检查中使用 === 可以避免 ESLint 警告。 - kvrao127
3
@yeyo Array.length 是一个数据属性。每次访问它时不会重新计算。 - Robby Cornelissen
13
如果array为空,!array.length的值为true!! - leoschet
4
针对使用React/TypeScript的读者,我想说测试时一定要用> 0。否则,像这样的语句将以一种不太预期的方式进行评估(与纯JS不相关): {array?.length && <MyReactComponentThatNeedsArrayNotToBeEmpty/> - David Constantine
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接