1、空對象、空引用以及undefined三種概念的區別
- 空對象:是對象,但它的值是指向沒有任何屬性的對象的引用, {}是指 不含任何屬性 的對象,當然對象屬性包括 字面值和函數;
- 空引用:obj=null 是指 變量值指向null變量 ,null是對象,但是空引用(不指向任何對象);
var a = null; console.log(typeof null); //object 注意:null 參與數值運算時其值會自動轉換為 0 console.log(null + 123);//123 console.log(null * 123);//0
- undefined:未定義,所以不是對象,本身被定義為“undefined”這一特殊類型,當然在js默認不賦值的情況下,一個變量為undefined.;
var a; console.log(a); //undefined console.log(typeof a); //undefined 注意:undefined參與任何數值計算時,其結果一定是NaN。NAN不等於任何數,包括自己,任何數加NAN都是NAN; NAN == NANA(false)
- null 與 undefined的區別
console.log(null == undefined);//true ==只需要判斷值是否相等 //ECMAScript認為undefined是從null派生出來的,所以把它們定義為相等的 console.log(null === undefined);//false ===需要判斷類型與值是否全部相等 console.log(typeof null == typeof undefined);//false
2、判斷是否為空對象的幾種方式
- .將Json對象轉化為json字符串,再判斷該字符串是否為"{}";
var a = {}; console.log(JSON.stringify(a) == "{}");//true ===同樣為true
- for in語法
- 簡單遍歷
var a = {}; function isEmptyObj(obj) { for (var key in obj) { return false; } return true; } console.log(isEmptyObj(a));//true
- 遍歷原型及自身上的可枚舉屬性,需要結合hasOwnProperty去除原型上的可枚舉屬性
var a = {}; function isEmptyObj(obj) { for (var key in obj) { if ({}.hasOwnProperty.call(obj, key)) return false; } return true; } console.log(isEmptyObj(a));//true
- 簡單遍歷
- Object.getOwnPropertyNames()方法 ----- 返回不包括原型上的所有自身屬性(包括不可枚舉的屬性)
var a = {}; //獲取到對象中的屬性名,存到一個數組中,返回數組對象,我們可以通過判斷數組的length來判斷此對象是否為空 //注意:此方法不兼容ie8,其余瀏覽器沒有測試 console.log(Object.getOwnPropertyNames(a).length === 0);//true
- 使用ES6的Object.keys()方法,與上述方法類似,返回值也是對象中屬性名組成的數組
var a = {}; console.log(Object.keys(a).length === 0);//true 返回不包括原型上的可枚舉屬性,即自身的可枚舉屬性
- jquery的isEmptyObject方法
var a = {}; //此方法是jquery將(for in)進行封裝,使用時需要依賴jquery console.log($.isEmptyObject(a)); //true
3、遇到的問題
暫無