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

Daf*_*aft 318 javascript arrays

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

像这样的东西?

if(array.length < 1 || array == undefined){
    //empty
}
Run Code Online (Sandbox Code Playgroud)

Rob*_*sen 635

你想先做检查undefined.如果你反过来这样做,如果数组是未定义的,它将产生一个错误.

if (array === undefined || array.length == 0) {
    // array empty or does not exist
}
Run Code Online (Sandbox Code Playgroud)

更新

这个答案得到了相当多的关注,所以我想指出,我的原始答案最重要的是解决了问题中评估条件的错误顺序.从这个意义上说,它无法解决几个场景,例如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
}
Run Code Online (Sandbox Code Playgroud)

要打破它:

  1. Array.isArray()不出所料,检查它的参数是否是一个数组.这会淘汰就像值null,undefined和其他任何不是数组.
    请注意,这也将消除类似于数组的对象,例如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
}
Run Code Online (Sandbox Code Playgroud)

或者,更常见的是它的逆:

if (array && array.length) {
    // array and array.length are truthy
    // ? probably OK to process array
}
Run Code Online (Sandbox Code Playgroud)

  • "Array"对象不是唯一具有length属性的对象._"最短"_确定变量是否已定义且数组是这样的方式:`if(typeof varName!=='undefined'&& Object.getPrototypeOf(Object(varName))=== Object.getPrototypeOf([ ])){console.log('varName是一个数组'); }` (10认同)
  • 使用`===`来避免在array.length条件检查中发出ESLint警告. (7认同)
  • @yeyo `Array.length` 是一个数据属性。不是每次访问时都计算。 (3认同)
  • `让 isArrayWithLength = Boolean(Array.isArray(array) &amp;&amp; array.length);` (2认同)
  • 如果array为空,则array.length为true。 (2认同)
  • @leoschet 如果您将其视为`!0`(或`!Boolean(0)`),那是有道理的。记住这一点,如果你真的想要,你可以使用 `!![].length` 再次翻转布尔值。建议在 REPL 中查看以下内容:`[].length`、`['foo'].length`、`!0`、`!1`、`!!0`、`!!1`。 (2认同)
  • 在现代 JS 中,这也可能是有趣的方法“if (array?.length &gt; 0)” (2认同)
  • @RobbyCornelissen 对于使用 React/Type Script 的读者,我想说用 `&gt; 0` 测试它非常重要,否则像这样的语句将以一种意想不到的方式进行评估(与纯 js 无关): `{array?.length &amp;&amp; &lt;MyReactComponentThatNeedsArrayNotToBeEmpty/&gt;` (2认同)