js-深拷贝和浅拷贝

深拷贝拷贝的是对象或者数组内部数据的实体,重新开辟了内存空间存储数据;

浅拷贝拷贝的是引用类型的指针,副本和原数组或对象指向同一个内存;

简单说数据的赋值,简单的数据直接赋值是没有问题的

问题:

var arr1 = new Array(12,23,34) Var arr2 = arr1;

//这就是一个最简单的浅拷贝

//写函数

 function copyObj(obj){  
 let newObj={};  
 for(let key in obj){   
  if(typeof obj[key] =='object'){//如:key是wife,引用类型,那就递归    
   newObj[key] = copyObj(obj[key])    
 }else{//基本类型,直接赋值     
  newObj[key] = obj[key];   
  }   
}  
 return newObj;
 } 

数组

1.concat方法

var arr1 = [1, 2, 3, 4] var arr2 = arr1.concat()

//复制当前数组并返回实现深拷贝的副本,arr1独立而不受影响 console.log(arr2);[1, 2, 3, 4] var arr3 = arr1.concat([5, 6, 7])

//将数组中的每一项都添加到深拷贝的副本数组中 console.log(arr3);

//[1, 2, 3, 4, 5, 6, 7] 2.slice方法 var arr = [1, 2, 3, 4] var arr1 = arr.slice(1)

//接收1到2个参数,一个参数时,返回参数指定调用方法数组位置到末尾的值组成的深拷贝副本 console.log(arr1);

//[2, 3, 4] var arr2 = arr.slice(0, 1) console.log(arr2);

//[1] 3.扩展运算符 const arr = [1, 2, 3] const arr1 = [...arr] arr1.push(4) console.log(arr1);

//[1, 2, 3, 4] console.log(arr);

//[1, 2, 3] 注意,对于数组项是引用类型的数据,就无法实现深拷贝了 对象 对象 1.Object.assign(目标对象, 源对象),源对象的所有可枚举属性都复制到目标对象上

var obj = { a: 1, b: 2 }

var obj1 = {}

Object.assign(obj1, obj) console.log(obj1);

//{a: 1, b: 2} obj1.c = 3 console.log(obj1);

//{a: 1, b: 2, c: 3} console.log(obj);

//{a: 1, b: 2},obj没有被改变,实现了深拷贝

2.JSON var obj = { a: 1, b: 2 }

// 将javascript值转为JSON字符串 var jsonText = JSON.stringify(obj) console.log(jsonText);

//{"a":1,"b":2}

// 把JSON字符串转为javascript值 var obj1 = JSON.parse(jsonText) console.log(obj1);

//{a: 1, b: 2}

// 修改obj1,看原对象值是否被改变 obj1.c = 3 console.log(obj1);

//{a: 1, b: 2, c: 3} console.log(obj);

//{a: 1, b: 2},没被改变,实现了深拷贝

3.扩展运算符 var obj = { a: 1, b: 2 } var obj1 = {...obj} console.log(obj);

//{a: 1, b: 2} console.log(obj1);

//{a: 1, b: 2} obj.a = 33 console.log(obj);

//{a: 33, b: 2} console.log(obj1);

//{a: 1, b: 2}没改变,实现了深拷贝

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值