JS中分为两种数据类型
一种是基本数据类型
另一种是引用数据类型
然后基本数据类型和引用数据类型的区别在于:基本数据类型是按值传递的,引用数据类型是按引用的的地址传递,将存放在栈内存中的地址赋值给接受的变量
浅拷贝只是复制对象的第一层属性,并不包括对象里面为引用类型的数据,如果属性是基本类型,拷贝的就是基本类型的值,如果属性时引用数据类型,拷贝的就是内存地址。当改变拷贝的对象里面的引用类型时,原对象也会改变。
深拷贝会重新开辟一个内存空间,拷贝多层,每一层级的数据都会拷贝过来。操作拷贝之后的对象的某个属性不会影响原始对象中的属性。
浅拷贝实现方法:
1.Objcet.assign()
2.引用复制
//先定义一个变量,往里面放些属性
var obj = {
name:'xx',
age:'18',
friend:{
name:'xxx',
age:'17'
}
}
//再定义一个函数,函数里面放一个参数
function objCopy(fromObj){
//定义一个空对象,将fromObj的属性都copy到空对象里面
var a = {}
//然后通过遍历来将fromObj的属性赋值给a
for(var key in fromObj){
a[key] = fromObj[key]
}
//最后把这个a返回出去
return a ;
}
//然后在下面定义一个变量,存调用objCopy的返回值
var x = objCopy(a)
//
深拷贝
递归方法
//先定义一个变量,里面放些属性
var obj = {
name:'xx',
age:'18',
friend:{
name:'xxx',
age:'17',
friend:{
name:'zzz',
age:'21'
}
}
}
//定义一个函数,里面存放两个参数,to和from
function deepCopy(to,from){
//遍历from对象的所有属性,拷贝到to对象中
for(var key in from){
//判断from对象中是不是原型链上的,如果不是,就说明是当前对象上的就开始进行递归操作
if(from.hasOwnProperty(key) //判断from中是否有key,如果有的话返回true,没有返回false){
//判断属性是否为引用数据类型,如果是就进行递归复制
if(from[key] && typeof from[key] === 'object'){
//判断属性是对象还是数组
to[key] = from[key].constructor === Array ? [] : {}
to[key] = deepCopy(to[key],from[key])
}else{
//如果不是就是简单的直接复制
to[key] = from[key]
}
}
}
//返回to
return to
}
var newObj = deepCopy({},obj);