(一)浅拷贝
var obj1 = {
name: 'zs',
school: 'qq',
major: {
math: 'gs'
}
}
var obj2 = obj1
obj1.major.math = 'zh'
console.log(obj2.major.math) // zh
两个对象指向同一个引用地址,其中一个变了,其他对象的相应字段也都会改变,这是浅拷贝
(二)深拷贝
深拷贝实现的目的就是:其中一个变了,其他对象的相应字段不会改变,仍然保持原有的值,这是深拷贝,深拷贝的原理就是为对象重新开辟内存空间,然后把其需要参照的对象循环复制,存入新的内存中
var obj1 = {
name: 'zz',
age: 23,
arr: [1, 2, 3],
major: {
main: 'computer',
other: 'math',
majorArr: [1, 2, 3],
}
}
// 深拷贝 针对数组和对象
function deepClone (target) {
// 如果不是数组或者对象直接返回
if (typeof target !== 'object') {
return target
}
let newData;
if (target instanceof Object) {
newData = {}
}
if (target instanceof Array) {
newData = []
}
for (let key in target) {
// hasOwnProperty
if (target.hasOwnProperty(key)) {
newData[key] = deepClone(target[key]) // 递归!!对象的值是对象也需要处理
}
}
return newData
}
var obj2 = deepClone(obj1)
obj1.major.other = 333
obj1.arr[0] = 344
obj1.major.majorArr[1] = 399
console.log(obj2)
console.log(obj1)
可以看出 obj1 是 obj1,obj2 是 obj2,互不影响,这就是深拷贝