深浅拷贝:
深拷贝和浅拷贝是针对复杂数据类型来说的,浅拷贝只拷贝一层,而
深拷贝是层层拷贝。
深拷贝 复制地址的内容。就是说递归的复制内部数据找到基本数据类型之后才复制出来
深拷贝复制变量值,对于非基本类型的变量,则递归至基本类型变
量后,再复制。浅拷贝拷贝的存贮在栈内存
深拷贝后的对象与原来的对象是完全隔离的,互不影响,
对一个对象的修改并不会影响另一个对象,深拷贝存储在堆内存。
浅拷贝:只是复制外层地址的拷贝 ,没有继续往内部找基本数据类型。
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值
是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。 可 以 使 用 Json.stirfy。JSON.parse ,(缺点:不能复制函数)forin、 Object.assign、 扩 展 运 算 符 … 、A rray.prototype.slice()、Array,递归等来实现深拷贝。
**基本数据类型:**不能添加属性和方法
**对象数据类型:**可以添加属性和方法
。
递归方式实现深拷贝
function copy(arr) {
var newObj;
// 实例化
// 先检测他的数据类型
// 初始化 让他是对象或者数组
newObj = arr instanceof Array ? [] : {}
// 数组和对象都可以用for in循环
// for in 循环的是key for of 循环的是value
// 但是有一个缺点就是说
//在我们数组的原型上他也会遍历 之遍历对象自身的属性 不便利原型链的属性用hasownproperty
for (var key in arr) {
if (arr.hasOwnProperty(key)) {
typeof arr[key] == 'object' ? copy(arr[key]) : arr[key]
}
}
// 返回的最终结果就是我们实现深拷贝之后的结果
return newObj;
}
var arr = [{
id: 1004,
name: "jack",
age: '22'
},
{
id: 1002,
name: "alice",
age: '2162'
},
{
id: 1003,
name: "haha",
age: '2232'
},
]
var result = copy(arr);