【JS】JS里判断一个变量是否为空数组。
JS里,判断一个变量是否为空数组,常用的一般是判断这个变量的长度是否为0。如果用了下面的这种方式,判断条件就为false。这个是因为什么?
回答
[]可以理解为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