手写深拷贝、深度比较

172 阅读1分钟

手写深拷贝

题目如下,实现deepClone深拷贝函数

/*深拷贝*/
const obj1 = {
    age:20,
    name:'tanwa',
    address:{
        city:'Shengzhen'
    },
    arr:['a','b','c']
}

const obj2 = deepClone(obj1);

obj2.address.city = 'Guangzhou';
console.log(obj1.address.city);

/**
 *深拷贝
 *@param {Object} obj 要拷贝的对象
 */
 function deepClone(obj = {}){
     return {}
 }

解答:

function deepClone(obj = {}){
    if(typeof obj !== 'object' || obj == null){
        //obj是null,或者不是对象和数组,直接返回
        return obj;
    }
    //初始化返回结果
    let result;
    if(obj instanceof Array){
        result = [];
    } else{
        result = {};
    }
    for(let key in obj){
        //保证key不是原型的属性
        if(obj.hasOwnProperty(key)){
            //递归调用
            result[key] = deepClone(obj[key])
        }
    }
    return result;
} 

手写深度比较 isEqual

//实现如下效果
const obj1 = {a:10,b:{x:100,y:200}}
const obj2 = {a:10,b:{x:100,y:200}}
isEqual(obj1,obj2) === true

解答

//判断是否是对象或数组
function isObject(obj){
    return typeof obj === 'object' && obj !== null
}
//全相等
function isEqual(obj1,obj2){
    if(!isObject(obj1) || !isObject(obj2)){
         //值类型(注意,参与equal的一般不会是函数)
         return obj1 === obj2
    }
    if(obj1 === obj2){
        return true
    }
    //两个都是对象或数组,而且不相等
    //1.先取出obj1和obj2的keys,比较个数
    const obj1Keys = Object.keys(obj1)
    const obj2Keys = Object.keys(obj2)
    if(obj1Keys.length !== obj2Keys.length){
        return false
    }
    //2. 以obj1为基准,和obj2一次递归比较
    for(let key in obj1){
        //比较当前key的val  --递归!!
        const res = isEqual(obj1[key],obj2[key])
        if(!res){
            return false
        }
    }
    //3. 全相等
    return true    
}


const obj1 = {a:10,b:{x:100,y:200}}
const obj2 = {a:10,b:{x:100,y:200}}
//console.log(obj1 === obj2) //false
console.log(isEqual(obj1,obj2))//true