主要思路
我們要考慮到的主要有:js原生對象,宿主對象(瀏覽器上面的)。
首先對於宿主對象
主要判斷是DOM 對象 和是否是window 對象
是否是DOM對象 value.nodeType 是否存在。
是否是window 對象,value != null && value === value.window;
對於這兩種肯定不是空對象。
1 if(value.nodeType || isWindow(value)){ 2 return false; 3 }
對於js原生對象
是否本身返回就是false 對於自身返回false 的有 'false','null' ,' "" ','undefined','NaN', '0' 這6中情況
這些顯然不能作為空對象。
然后判斷是否是一個對象 使用 Object.prototype.toString.call(value) === '[object Object]'; 簡稱為 isObject
還有一種判斷,判斷是否擁有 hasOwnPrototype 方法。
1 if(!value || !isObject(value) || !value.hasOwnPrototype){ 2 return false; 3 }
如果都不滿足這些情況的話,
需要處理 是否擁有自身屬性,
1 for(var key in value){ 2 if(value.hasOwnPrototype(key)){ 3 return false; 4 } 5 }
完整代碼:
1 function isEmptyObject(value){ 2 if(value.nodeType || isWindow(value)){ 3 return false; 4 } 5 6 if(!value || !isObject(value) || !value.hasOwnPrototype){ 7 return false; 8 } 9 10 for(var key in value){ 11 if(value.hasOwnPrototype(key)){ 12 return false; 13 } 14 } 15 return true; 16 }
