深拷贝和浅拷贝的区别

1.当拷贝到值是对象或数组时,浅拷贝只复制了值的引用,没有将对象所占的内存完全拷贝下来。基本数据类型可直接复制。
判断点:当拷贝对象数据类型时,可以看是否产生了新的数据还是只是复制了值的引用。

代码实现

 // 判断数组或对象类型

 function cloneType (target) {

 return Object.prototype.toString.call(target).slice(8,-1)

 }

  

 // 深拷贝

 function cloneDeep (target) {

 let result

 if (cloneType(target) === 'Object'){

 result = {}

 }else if (cloneType(target) === 'Array') {
 
 result = []
 
 }

 else {
 
    result = target
    
 }

 for(let i in target) {

 let item = target[i]

 if (cloneType(item)==='Object' || cloneType(item) ==='Array' ) {

 result[i] = cloneDeep(item)

 }else {

    result[i] = item

   } 

 }

 return result

}
验证结果
 let person = {name: 'zhangsan', age: 13, 

 option:{

 sex:'man',

 fav:'football'

 }

 }

 let person2 = cloneDeep(person)

 console.log(person2)

 console.log('---------------')

 person.option.sex = 'woman'

 console.log(person2)

image.png

实现思路
1.主要是通过递归的思想来实现,要判断当前拷贝是什么数据类型,来决定函数要返回什么样的数据类型。
2.接着如果确定是对象数据类型之后再判断里面是否还有引用类型的数据,若有则重复之前的步骤直到拷贝的是基本数据类型。

XiaoYu
7 声望0 粉丝

如其所是