检查数组是否为空或不存在的最佳方法是什么?
像这样的东西?
if(array.length < 1 || array == undefined){
//empty
}
检查数组是否为空或不存在的最佳方法是什么?
像这样的东西?
if(array.length < 1 || array == undefined){
//empty
}
您想先进行检查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
}
分解:
Array.isArray()
不出所料,检查它的参数是否是一个数组。这杂草淘汰的value观一样null
,undefined
和其他任何不是数组。
请注意,这也将消除类似数组的对象,例如arguments
对象和 DOMNodeList
对象。根据您的情况,这可能不是您所追求的行为。
该array.length
条件检查是否变量的length
属性值将为一个truthy值。因为前面的条件已经确定我们确实在处理一个数组,所以这里不需要像array.length != 0
or那样更严格的比较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 中可选链运算符(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
}