js 判斷空對象
首先要區分一個概念,空對象和空引用:
空對象:{}是指不含任何屬性的對象,當然對象屬性包括字面值和函數。
空引用:obj=null 是指變量值指向null變量,當然在js默認不賦值的情況下,一個變量為undefined.
空對象的討論:
原型:
原型上包括了繼承屬性,有可以枚舉的屬性和不可以枚舉的屬性。默認對象都繼承了Object。
自身:
自身屬性同樣包括了可枚舉的屬性和不可枚舉的屬性。
限定場景:
后台JSON對象:
判斷后台傳來的對象為空對象,此時,該對象一般為JSON對象,此時可以忽略原型上的屬性判斷,因為JSON對象也是一個普通對象,不過它的結構有時候比較特殊,該對象默認基礎Objcet,然而,作為一個從后台傳來的對象,后台無法實現原型繼承、不可枚舉這種特性,這個時候,只需要關注對象自身可枚舉屬性時是否為空即可。
解決方案:
方案 1:
var data = {};
var b = JSON.stringify(data) == "{}";
alert(b); //true
方案 2:
Object.keys(obj)返回不包括原型上的可枚舉屬性,即自身的可枚舉屬性
var data = {};
var b = Object.keys(data).length === 0;
方案 2 模擬實現:
for in語法遍歷原型及自身上的可枚舉屬性,需要結合hasOwnProperty去除原型上的可枚舉屬性
var data = {};
function isEmptyObj(obj) {
for (var key in obj) {
if ({}.hasOwnProperty.call(obj, key)) return false;
}
return true;
}
var b=isEmptyObj(data);
console.log(b);
方案 3:
Objcet.getOwnPropertyNames(obj)返回不包括原型上的所有自身屬性(包括不可枚舉的屬性)
var data = {};
var b=Object.getOwnPropertyNames(data)===0;
console.log(b);
