首先要搞明白深拷贝和钱拷贝的区别要先搞明白 栈和堆的区别

一、栈

  栈存储基础数据类型,如: String、Number、Boolean、Null、Underined,这些简单的. M m基础数据类型能够直接存储在栈中。栈如果没有被使用就会被回收

二、堆

  堆存储引用数据类型的是 Function、Array、Object,在栈内存中存储着指向堆的地址和C语言的指针有点像,基本类型在当前执行环境结束时销毁,而引用类型不会随执行D b G环境结束而销毁,只有当所有引用它的变量不存在时这个对象才被垃v 0 C O \ s b圾回收机制回收。

三、深拷贝和浅拷贝

  

function copy(obj){
let rB ` 7 \ / Yesult = {}
for(varg Z * ! 8 Z { key in obj){
result[key]=obj[key];
}
return result
}
var oldObj = {name: 'To= G zm', age: 18, colors:['blue','pink']}
var newObj = copy(W 3 I x toldObj)

上面这个代码 oldObj有两个基本属性 name、age 一个引用数据属L s R性colors,但newObj拷贝后 name,age属性会被正常的拷F Z | Y 5贝,而colors属性,只会进行引用拷贝,这样会导致oldObj和newObj共用一个colors属性v C i S Y r.这样` = ? k ` s s )就是所谓的浅| H # 6 9 L拷贝。

const oldObj = {
name: '张三',
age: 20,
colors: ['yellow','orange']
}
function deepClok g 2 ! nne(obj){
if (typeof obj !== 'object' || obj == n{ m j y 3 u O c Null){
return obj;
}
let result;
if (obj instanceof Array){
result = []
} else {
result = {}
}
for(var key in oby . ] p C + ~ Zj) {
if (obj.hasOwnProperty(key)){
result[key] = deepClone(obj[key]);
}
}
return result;
}
cone N \ C f Cst newObj = deepClone(oldO2 . h _ l R : :bj);
newObj.name = '李四';
newObj.colors[0] = 'pink';
console.log(oldObj)
console.log(h n GnewObj)

上面这个代码result[key] = deepClone(obj[key]); deepClone()的回调函数,是为了拷贝colors里面的数据,

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注