前置知识:
常用数据类型:
基本类型:String/Number/Boolean/Null/Undefined
引用类型:Function/Object/Array
知悉:var a =123 => 左边的常量a为栈,右边的123为堆,栈指向堆
概念:
浅拷贝:就是创建一个新对象,这个对象对原来对象的属性值记性一份拷贝
如果属性是基本类型,拷贝的就是基本类型的值
如果属性是引用类型,拷贝的就是内存地址
深拷贝:将一个对象从内存中完整的拷贝一份出来,堆内存开辟一个新的区域存放新对象,
且修改新对象不会影响原对象
浅拷贝和赋值的区别
var person={
name:“爱就一个字”,
hobby:['学习',['看电影','购物'],'跑步'],
date:new RegExp('\\w+')
function(){}
}
赋值:
当我们把一个对象赋值给一个新的变量值时,赋的其实是该对象在栈中的地址,而不是堆中的数据,也就是连个对象指向的是同一个存储空间,无论哪个对象发生改变,其实都是改变的存储空间的内容
var person1 =person
person1.name='王小星'
preson1.hobby[0] ='玩耍'
console.log(preson)
console.log(person1) =====>结果相同
浅拷贝:
重新在堆中创建内存,拷贝前后对象的基本数据类型互不影响,但拷贝前后对象的引用类型因共享同一块内存,会相互影响
function shallowCopy(obj){
var target={}
for (var i in obj){
if(obj.hasOwnProperty(i)){
target[i]=obj[i]
}
}
return target
}
var person1=shallowCopy(person)
person1.name="王小星" //基本数据类型,基本数据类型互不影响
person1.hobby[0]= '玩耍' //这里是引用数据类型 数组 所以拷贝前后对象会相互影响
console.log(person)
console.log(person1)
深拷贝
从堆内存中开辟一个新的区域存放新对象,对对象中的子对象进行递归拷贝,拷贝前后的两个对象
互不影响
function deepClone(obj){
var cloneObj={}
if(obj === null) return obj //当 typeOf去console.log null时,出现的也是obj对象
if(obj instanceof Date) return new Date(obj) //instanceof 用来判断左边的是否为右边的类的实例(就是说Date的propertype是否在obj的原型链上)
if(obj instanceof RegExp) return new RegExp(obj)
if(typeOf obj !=='object') return obj
for (var i in obj){
if(obj.hasOwnProperty(i)){
cloneObj[i]=deepClone(obj[i])
}
}
return cloneObj
}
var person1=deepClone(person)
var person1=JSON.parse(JSON.stringify(person))
//json.parse的正则RegExp和function与深拷贝的不同
person1.name="王小星"
person1.hobby[0]= '玩耍'
console.log(person)
console.log(person1)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。