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

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

回答

[]可以理解为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是无法判断的

楼上返回true

以上是 【JS】JS里判断一个变量是否为空数组。 的全部内容, 来源链接: utcz.com/a/86882.html

回到顶部