深拷贝与浅拷贝的区别
简单理解:浅拷贝就是a与b对象指向同一块地址,一个变另一个也变。深拷贝就是自己有自己的地址,自己改变了一个属性的不影响copy者的属性。
1.基本数据类型的特点:直接存储在栈(stack)中的数据
引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里。
2.详解:引用数据类型在栈中存储了指针,该指针指向堆中该实体的起始地址。当解释器寻找引用值时,会首先检索其在栈中的地址,取得地址后从堆中获得实体。
深拷贝和浅拷贝是只针对Object和Array这样的引用数据类型的。
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。
3.实现浅拷贝的方法
(1)无非就是循环遍历
function shallowCopy(oldObj) {
var newObj = {};
for(var i in oldObj) {
if(oldObj.hasOwnProperty(i)) {
newObj[i] = oldObj[i];
}
}
return newObj;
}
(2)es6的扩展运算符
var arr = [{name:'poetries',age:22}]
var target = [...arr]
(3) const obj2 = Object.assign({}, obj1)
深拷贝方法
(1)JSON方法
var result=JSON.parse(JSON.stringify(oldObj))
(2)自己实现一个深拷贝方法
function deepCopy (obj) {
var result;
//引用类型分数组和对象分别递归
if (Object.prototype.toString.call(obj) == '[object Array]') {
result = []
for (i = 0; i < obj.length; i++) {
result[i] = deepCopy(obj[i])
}
} else if (Object.prototype.toString.call(obj) == '[object Object]') {
result = {}
for (var attr in obj) {
result[attr] = deepCopy(obj[attr])
}
}
//值类型直接返回
else {
return obj
}
return result
}