浅拷贝
拷贝的是地址。修改拷贝后的数据,对原数据有影响,两个对象指向同一个地址
在JavaScript中,存在浅拷贝的现象有:
- Object.assign
- Array.prototype.slice(), Array.prototype.concat()
- 使用拓展运算符实现的复制
深拷贝
拷贝的是数据。修改修改后的数据,对原数据没有影响,两个对象指向不同的地址
在JavaScript中,存在深拷贝的现象有:
- JSON.stringify()
- 手写循环递归
JSON.stringify()
let obj = {name:'张三',age:20,hobby:['学习','上课','敲代码']}
let obj1 = JSON.parse( JSON.stringify(obj) )
手写循环递归
let obj = { name: '张三',age: 20, hobby: ['学习', '上课', '敲代码'],student:{name:'班长',age:30} }
//声明深拷贝函数
function kaobei(obj, newObj) {
//遍历obj数据
for (let key in obj) {
//如果obj[key]是数组,还需要继续遍历拷贝数据
if (obj[key] instanceof Array) {
//(1)给newObj声明空数组
newObj[key] = []
//(2)循环遍历拷贝数组每一个元素
// for(let i in obj[key] ){
// newObj[key][i] = obj[key][i]
// }
kaobei( obj[key] , newObj[key] )
} else if( obj[key] instanceof Object){
newObj[key] = {}
kaobei( obj[key] , newObj[key] )
}else {
newObj[key] = obj[key]
}
}
}
//声明一个空对象,存储拷贝后的数据
let newObj = {}
kaobei(obj, newObj)