JS里,判断一个变量是否为空数组,常用的一般是判断这个变量的长度是否为0。如果用了下面的这种方式,判断条件就为false。这个是因为什么?
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)
}
两个对象比较,会比较它们在内存中是不是同一个对象,虽然都是[],但是不是同一个,所以判断条件为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;
}
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.6k 阅读✓ 已解决
[]可以理解为
new Array()
,相当于声明了一个新的空数组,程序会自动在堆中为其开辟一块内存空间,它和之前a = []生成的内存空间不是同一块,所以自然不相等。判断一个数组是否为空:
所以如果业务代码中一旦遇到这种bug,就需要来个函数freestyle了: