① 方法一:通过JSON.stringify(obj)来判断两个对象转后的字符串是否相等

优点:用法简单,对于顺序相同的两个对象可以快速进行比较得到结果
缺点:这种方法有限制就是当两个对比的对象中key的顺序不是完全相同时会比较出错

② 方法二:有递归的情况 ,对象里包含 对象 和 数组 

 function equals(a, b) {
        let ArrayA = Object.getOwnPropertyNames(a)
        let ArrayB = Object.getOwnPropertyNames(b)
     

        if (ArrayA.length != ArrayB.length) return false
        console.log(a)
        for (let i = 0; i < ArrayA.length; i++) {
            let propNameA = ArrayA[i]
            let propNameB = ArrayB[i]
          
            if (!a.hasOwnProperty(propNameB)) return false;

            if(a instanceof Object){
                if(equals(a[propNameA],b[propNameA])){

                }else{ return false; }
            }else{
                if (a[propNameA]===b[propNameA]) {
                    
                }else{
                    return false;
                }
            }
            
            return true;

步骤: 1. 判断对象属性的长度是否一致

            2.for循环,判断A对象里是否包含B的属性

            3.然后判断 A对象的属性是否是 对象属性,如果是,再调用一次本函数

             4.判断A的属性值是否等于B的属性值   

tip: 这里提示下:

1. keys()  输出为一个数组,取到的是 obj 的所有的自身可枚举属性。其功能和for in + hasOwnProperty()功能是一致的
2. getOwnPropertyNames() 输出为一个数组,取到的是 obj 的所有自身属性。(可枚举、不可枚举,但不包括symbol类型的属性)
3. getOwnPropertySymbol()  输出为一个数组,取到的是 obj 的所有自身的Symbol属性
4. for(key in obj)  遍历 obj 的所有属性,包括自身属性和原型上的所有可枚举的属性
5. JSON.stringify()  只能将自身的可枚举的属性转化成字符串

一般遍历的都是可枚举属性,且不包括Symbol,除了getOwnPropertyNames()。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐