检查数组是否为空或不存在的最佳方法是什么?
像这样的东西?
if(array.length < 1 || array == undefined){ //empty }
你想先做检查undefined。如果反过来,如果数组未定义,则会产生错误。
undefined
if (array === undefined || array.length == 0) { // array empty or does not exist }
这个答案得到了相当多的关注,所以我想指出我的原始答案,最重要的是,解决了问题中评估条件的错误顺序。从这个意义上说,它无法解决几个场景,例如null值、具有length属性的其他类型的对象等。它也不是非常惯用的 JavaScript。
null
length
万无一失的方法 从评论中得到一些启发,下面是我目前认为检查数组是否为空或不存在的万无一失的方法。它还考虑到变量可能不是指向数组,而是指向具有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()
arguments
NodeList
array.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 中可选链式运算符(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 }