手写深拷贝
题目如下,实现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