如何判断一个对象是一个空对象(不带继承的原型属性,如果带的话只能用for in)
空对象的呈现是var obj = {}
function IsEmptyObject(obj){
if(!obj || typeof obj != 'object' || Array.isArray(obj)){
return false;
}
//第一种
//测试性能段
/*
console.time('first');
if(JSON.stringify(obj) === '{}'){
console.timeEnd ('first');
return true
}else{
console.timeEnd ('first');
return false;
}
*/
return (JSON.stringify(obj) === '{}')
//第二种
console.time('second');
for(var key in obj){
console.timeEnd ('second');
return false
}
console.timeEnd ('second');
return true;
//第三种
return (Object.keys(obj).length === 0)
}
解决思路
第一种就是粗暴的直接转字符串,然后强行比较
第二种就是利用for in
的原理,然后一旦进了循环,说明有key
值,那就直接false
啦,否则就是空对象
性能比较
下面测试一下两个方法的性能比较
- 第一种在a就是一个空对象的情况下,在Imac谷歌浏览器上平均耗时在
0.012ms
左右 - 第二种在a就是一个空对象的情况下,在Imac谷歌浏览器上平均耗时在
0.007ms
左右,性能差距为两倍 - 第一种在a是一个普通对象的情况下,豆瓣的api对象,在Imac谷歌浏览器上平均耗时在
0.08ms
左右 - 第二种在a是一个普通对象的情况下,豆瓣的api对象,在Imac谷歌浏览器上,第一次稍慢,
0.02ms
,平均耗时在0.0075ms
左右,性能差距随着对象越大,差距也会越大
总结。
这种情况如果在日常使用的时候是可以使用第一种的,如果需要大数据交互中仅仅是某一个判断的话,还是用第二种吧,毕竟涉及到循环,性能差距还是很大的
思考
既然用到了JSON.stringify,那么JSON.stringfy/parse如何使用呢,兼容性如何呢,如何自己实现一个呢
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。