哪种判断对象为空方式最好


先说结论,第二种 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()]

文章作者: iamfugui
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 iamfugui !
评论
  目录