首先說下null與undefined區別:
對已聲明但未初始化的和未聲明的變量執行typeof,都返回"undefined"。
null表示一個空對象指針,typeof操作會返回"object"。
一般不顯式的把變量的值設置為undefined,但null相反,對于將要保存對象的變量,應明確的讓該變量保存null值。
var bj;
alert(bj); //"undefined"
bj = null;
alert(typeof bj); //"object"
alert(bj == null); //true
bj = {};
alert(bj == null); //false
/** 檢測對象是否是空對象(不包含任何可讀屬性)。* 方法既檢測對象本身的屬性,也檢測從原型繼承的屬性(因此沒有使用hasOwnProperty)。*/
function isEmpty(obj)
{for (var name in obj) {return false;}return true;
};
這里所說的空對象,到底是?{}還是?null .我寫了一個測試用例。
var?a = {};
a.name = 'realwall';
console.log(isEmpty(a));? //false
console.log(isEmpty({}));? //true
console.log(isEmpty(null));? //true
//注意參數為null時無語法錯誤哦,即雖然不能對null空指針對象添加屬性,但可以使用for in語句。
/** 檢測對象是否是空對象(不包含任何可讀屬性)。* 方法只既檢測對象本身的屬性,不檢測從原型繼承的屬性。*/
function isOwnEmpty(obj)
{for(var name in obj){if(obj.hasOwnProperty(name)){return false;}}return true;
};
{}與null的區別:
這個東西很重要。
var?a = {};
var?b = null;
a.name = 'realwall';
b.name = 'jim'; //這里會報錯,b為空指針對象,不能像普通對象一樣直接添加屬性。
b = a;
b.name = 'jim'; //此時 a和 b指向同一個對象。a.name, b.name均為'jam'
?
做項目時遇到一個問題,判斷一個對象是否為空對象,發現這樣判斷可以,上代碼:
1. 代碼1:
var a = {};
if(!a){ console.log(1);}
else if(a == null) { console.log(2);}
else { console.log(3);}
結果為:3
2. 代碼2:
var b = {};
if(b == {}){ console.log(4);}
if(b == '{}') { console.log(5);}
if(typeof(b) == 'object') { console.log(6);}
結果為:6
3. 代碼3:
var c = {};
if(JSON.stringify(c) == "{}"){ console.log(7);}
結果為: 7
所以可以使用代碼3的方法判斷對象是否為空對象{};
如果對象不為空,并且知道對象不為空時,某個屬性(比如{id:111})一定存在,則可以里這樣判斷:
4. 代碼4:
var d = {};
var e = {id:111};
if(d.id){ console.log(8);}
if(e.id){ console.log(9);}
結果為:9
小結:顯然代碼3的判斷方式比較“強勢”,但效率明顯不如代碼4的判斷方法
補充:
function checkNullObj (obj) {return Object.keys(obj).length === 0
}
?