什么是深拷贝?

深拷贝对应的是浅拷贝,浅拷贝就是字面上的,例如B拷贝A,就是将A的内容复制给B,如果B发生变化,那么A也跟着改变,这就算是浅拷贝!所以深拷贝和浅拷贝的区别就在于拷贝后的数据是否影响复制源!

面试题十三:什么是深拷贝?拷贝哪些方式?如何实现深拷贝?-Qui-Note

浅拷贝:修改拷贝后的数据会影响源数据 
深拷贝:修改拷贝后的数据不会影响源数据

直接赋值是浅拷贝,以下就不多说了,一个“=”拷贝内容;下面总结一些其他拷贝数组和对象的方法!

一.数组拷贝方法都有哪些?  

1.slice()  不带任何参数的时候,默认返回一个长度和原数组相同的新数组

let a = [1,2,3,5]
let b = a.slice();

2.concat() 链接一个新数组,相当于concat([])

let c = a.concat();

3.手写

function copy(obj){
	var newO = {};
	for(let keys in obj){
		newO[keys] = obj[keys]
	}
	return newO;
}

二、对象拷贝方法都有哪些?

1.{...obj}  ES6扩展运算符,解析解构法
 

let aa = {
	name:'七娃',
	sex:'男'
}
let bb = {...aa}

2.Object.assign(new,old1,old2)  ES6 合并为对象

let cc = Object.assign({},aa)

3.手写函数

function copy(obj){
	var newO = {};
	for(let keys in obj){
		newO[keys] = obj[keys]
	}
	return newO;
}

以上拷贝方法均属于 浅拷贝 的方法,那么为保证改变拷贝后的对象不影响 源对象,如何实现深拷贝?

深拷贝的方法有哪些?

1.JSON格式转换法

function deepCopy(obj){
  return JSON.parse(JSON.stringify(obj));
}

2.手写深拷贝
 

function deepCopy(obj){
	var newObj = Array.isArray(obj)?[]:{}
	for(let keys in obj){
		if(obj.hasOwnProperty(keys)){
			newObj[keys] = typeof obj[keys]==='object' ? deepCopy(obj[keys]) : obj[keys]
		} 
	}
	return newObj; 
}

无论深拷贝还是浅拷贝,考验的都是对数组和对象的操作和递归!面试题十三:什么是深拷贝?拷贝哪些方式?如何实现深拷贝?-Qui-Note