美文网首页
对象是否为空对象

对象是否为空对象

作者: AAA前端 | 来源:发表于2023-12-20 20:21 被阅读0次

先说结论 Reflect.ownKeys({}).length === 0 这样来判断对象是否为空

  1. JSON.stringify(obj) === '{}'
    var obj = {
        a: undefined,
        b: function(){},
        c: Symbol()
    }

    console.log(JSON.stringify(obj) === '{}') // true

如果存在undefined,函数,Symbol值, 序列化过程中会被忽略。

  1. for in 和 hasOwnProperty
    const obj = {}
    Object.prototype.a = 1;
    function isEmpty (obj) {
        let flag = true
        for (let o in obj) {
            if (obj.hasOwnProperty(o)) {
                flag = false
                break
            }
        }
        return flag
    }
    console.log(isEmpty(obj)) // true

但是 for in 不能遍历不可枚举的属性

    const obj = {}
    Object.prototype.a = 1;
    function isEmpty (obj) {
        let flag = true
        for (let o in obj) {
            if (obj.hasOwnProperty(o)) {
                flag = false
                break
            }
        }
        return flag
    }

    // 
    const ykx = {}
    Object.defineProperty(ykx, "sex", {
        value: "male",
        //是否为枚举属性
        enumerable: false
    });
    console.log(isEmpty(obj)) // true
    console.log(isEmpty(ykx)) // false
  1. Object.keys 同 for in 一样不能遍历不可枚举的属性
  2. Object.getOwnPropertyNames 可以获取对象自身的所有属性名组成的数组(包括不可枚举属性)
    const ykx = {}
    Object.defineProperty(ykx, "sex", {
        value: "male",
        //是否为枚举属性
        enumerable: false
    });
    console.log(Object.getOwnPropertyNames(ykx)) // ['sex']

但是不能获取Symbol值作为名称的属性

    const a = Symbol()
    const obj = {
        [a]: 1
    }
    
    console.log(Object.getOwnPropertyNames(obj)) // []
  1. 最终方案 Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)).length 或者 Reflect.ownKeys

    const a = Symbol()
    const obj1 = {
        [a]: 1
    }
    const obj2 = {b:2}
    const obj3={}
    Object.defineProperty(obj3, 'ddd', {
        value: 111,
        enumerable: false
    })
    const obj4 = {}
    function getLength(obj){
        return Object.getOwnPropertyNames(obj).concat(Object.getOwnPropertySymbols(obj)).length
    }

    console.log(getLength(obj1)) // 1
    console.log(getLength(obj2)) // 1
    console.log(getLength(obj3)) // 1
    console.log(getLength(obj4)) // 0
    console.log(Reflect.ownKeys(obj1).length)// 1
    console.log(Reflect.ownKeys(obj2).length)// 1
    console.log(Reflect.ownKeys(obj3).length)// 1
    console.log(Reflect.ownKeys(obj4).length)// 0

相关文章

网友评论

      本文标题:对象是否为空对象

      本文链接:https://www.haomeiwen.com/subject/uycxndtx.html