JS里判断一个变量是否为空数组。

JS里,判断一个变量是否为空数组,常用的一般是判断这个变量的长度是否为0。如果用了下面的这种方式,判断条件就为false。这个是因为什么?
图片描述

阅读 56.4k
9 个回答

[]可以理解为new Array(),相当于声明了一个新的空数组,程序会自动在堆中为其开辟一块内存空间,它和之前a = []生成的内存空间不是同一块,所以自然不相等。

判断一个数组是否为空:

JSON.stringify(arr) === '[]'
arr.length === 0
+arr === 0

上面三种判断数组为空的方法虽然大多数情况下都可以用,但依然存在bug,比如令arr[-1] = ''时,数组不为空,但三者都返回true

所以如果业务代码中一旦遇到这种bug,就需要来个函数freestyle了:

var arr = []
arr[-1] = ''
function isEmptyObject(e) {  
    var t;  
    for (t in e)  
        return !1;
    return !0;
}  
isEmptyObject(arr);
var arr = [];
if(Array.isArray(arr) && arr.length === 0){
    console.log('是空数组');
}
// Array.isArray是ES5提供的,如果不支持。用下面的方案。
if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

数组是Object类型,Object类型用等号比较的是内存地址,你可以先判断是否为数组,再判断是否为空

var a = []
if(Object.prototype.toString.call(a) === '[object Array]' && a.length === 0){
console.log(13)
}

js中的引用类型即使是值相等,结果也不相等。

两个对象比较,会比较它们在内存中是不是同一个对象,虽然都是[],但是不是同一个,所以判断条件为false,可以用JSON.stringify(obj) === '[]'判断是否为空数组

可以这么理解

var a = new Array(); if (a == new Array()) { console.log(99) };

使用 JSON.stringify 判断不仅可能会有性能问题,而且遇到循环引用还会抛错,一般来说判断一下是 Array 且 length 为 0 就可以。

Array.isArray(arr) && arr.length <= 0

如果需要识别类数组的对象

isArrayLike(arr) && arr.length <= 0

采用 chrome dev-tools 的实现

    function isArrayLike(obj) {
      if (!obj || typeof obj !== 'object')
        return false;
      try {
        if (typeof obj.splice === 'function') {
          var len = obj.length;
          return typeof len === 'number' && (len >>> 0 === len && (len > 0 || 1 / len > 0));
        }
      } catch (e) {
      }
      return false;
    }
新手上路,请多包涵

内存地址不相等

首先判断是否为数组对象,其次用for in来判断下,因为有时候是字典数组,单是用length是无法判断的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题