當需要判斷參數是否為空時,總希望 js 能夠提供原生的判斷方法,可惜並沒有,只能自己封裝了。
function isEmpty(obj) {
// 檢驗 undefined 和 null
if(!obj && obj !== 0 && obj !== '') {
return true;
}
if(Array.prototype.isPrototypeOf(obj) && obj.length === 0) {
return true;
}
if(Object.prototype.isPrototypeOf(obj) && Object.keys(obj).length === 0) {
return true;
}
return false;
}
isPrototypeOf() 方法用於測試一個對象是否存在於另一個對象的原型鏈上。即判斷 Object 是否存在於 obj 的原型鏈上。需要注意的是,js 中一切皆是對象,也就是說,Object 也存在於數組的原型鏈上,因此這里數組需要先於對象檢驗。
ps:
isPrototypeOf 和 instanceof operator 是不一樣的。在表達式 object instanceof AFunction 中,檢測的是 AFunction.prototype 是否在object 的原型鏈中,而不是檢測 AFunction 自身。
該方法屬於 ES3 標准,現代瀏覽器均支持,包括 IE。 <( ̄︶ ̄)>
Object.keys() 方法會返回一個由給定對象的自身可枚舉屬性組成的數組,數組中屬性名的排列順序和使用 for...in 循環遍歷該對象時返回的順序一致、
該方法屬於 ES5 標准,IE9 以上和其它現代瀏覽器均支持。如果你很不幸的需要兼容 IE9以下瀏覽器,那就用 for...in 代替吧。但是,for...in 會將對象原型鏈上的屬性也枚舉出來,因此還需要加個判斷。
for(var key in obj) {
if(obj.hasOwnProperty(key)) {
return false;
}
}
hasOwnProperty()屬於 ES3 標准,現代瀏覽器均支持,包括 IE。可以放心使用啦。 <( ̄︶ ̄)>
還有一種很特別的檢驗空對象或空數組的方法,就是使用 JSON.stringify():
JSON.stringify(obj) === '{}';
JSON.stringify(obj) === '[]'
