浅拷贝 拷贝的是外层 内层拷贝的是引用的地址
如果属性是基本类型,拷贝的就是基本类型的值。如果属性是引用类型,拷贝的就是内存地址
var obj = {
id: 1,
name: 'lucy',
msg: {
age: 12,
goods: {
gname: 123,
gtype: 1,
},
},
colors: ['red', 'yellow', 'blue'],
}
var o = {}
// 第一种
// for (var k in obj) {
// // k 属性名 obj[k] 属性值
// o[k] = obj[k]
// }
// 第二种
// Object.assign()方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target)。
// Object.assign(目标对象,源对象1,源对象2)
// o = Object.assign({}, obj)
// console.log(o)
// o.name = '坤坤'
// console.log(obj.name)
// o.msg.age = 90
// console.log(obj.msg)
// -----浅拷贝数组
// slice
var arr = [11, 22, 33]
// var newArr = arr.slice(0)
// concat
// var newArr = arr.concat()
// 扩展运算符
var newArr = [...arr]
arr[1] = 'red'
// console.log(newArr)
深拷贝 深拷贝开辟了一个新的栈,两个对象属完全相同,但是对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性
// 第一种方式 lodash提供的cloneDeep
// 第二种方式 JSON.stringify
o = JSON.parse(JSON.stringify(obj))
// console.log(o)
// o.name = '坤坤'
// console.log(obj.name)
// o.msg.age = 90
// console.log(obj.msg)
// 第三种方式 递归
递归 简单来说就是函数自己调用自己 必须有结束条件
// 1+2+3+4+5+6+...+n
function sum(n) {
if (n == 1) {
return 1
}
return n + sum(n - 1)
}
sum(5)
递归深拷贝
var obj = {
id: 1,
name: 'lucy',
msg: {
age: 12,
goods: {
gname: 123,
gtype: 1,
},
},
colors: ['red', 'yellow', 'blue'],
}
var o = {}
function deepCopy(newObj, oldObj) {
for (var k in oldObj) {
// 拿到对象中的每一个值赋值给变量item
var item = oldObj[k]
// 判断item的基本数据类型,还是对象,还是数组
if (item instanceof Array) {
//数组
newObj[k] = []
deepCopy(newObj[k], item)
} else if (item instanceof Object) {
//对象
newObj[k] = {}
deepCopy(newObj[k], item)
} else {
//基本数据
newObj[k] = item
}
}
}
deepCopy(o, obj)
o.msg.age = 56
o.msg.goods.gname = 345
console.log(obj)