先说结论,第二种 Object.keys 方式最好,因为它能获取到非Symbol和可枚举属性,在一般需求下最好用。
let obj = {};
Object.keys(obj).length === 0;//true
1. JSON.stringify
序列化后判断 == “{}”
let obj = {};
JSON.stringify(a) === '{}'; //true
限制:
值为函数无法准确判断;属性为Symbol时无法准确判断;属性不可枚举时无法准确判断;
let a = { aa: function (){} }
console.log(JSON.stringify(a) === '{}');//true
2. Object.keys
Object.keys返回数组后判断数组长度
let obj = {};
Object.keys(obj).length === 0;//true
限制:属性为Symbol时无法准确判断;属性不可枚举时无法准确判断;
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'zhou但是不可枚举',
enumerable: false
})
obj[Symbol()]="符号值";
console.log(Object.keys(obj));//[] 都无法获取
3. for…in
构建一个函数,for…in遍历,如果有遍历一次马上return false,否则return true
function isEmptyObj(obj){
for(key in obj){
return false;
}
return true;
}
isEmptyObj({})//true
isEmptyObj({name:"zhou"})//false
限制:属性为Symbol时无法准确判断;属性不可枚举时无法准确判断;
4. Reflect.ownKeys
终极方法。Reflect.ownKeys 会获取所有自身属性,也就是包括Symbol和不可枚举。
let obj = {}
Object.defineProperty(obj, 'name', {
value: 'zhou但是不可枚举',
enumerable: false
})
obj[Symbol()]="符号值";
obj['fn']=function(){};
console.log(Reflect.ownKeys(obj));//['name', 'fn', Symbol()]