判斷一個對象是一個空對象的解決方案

如何判斷一個對象是一個空對象(不帶繼承的原型屬性,若是帶的話只能用for in)

空對象的呈現是var obj = {}api

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如何使用呢,兼容性如何呢,如何本身實現一個呢測試

相關文章
相關標籤/搜索