前端码农实现浅拷贝和深拷贝的几种方法

// 浅拷贝 
Object的assign可实现浅拷贝,拷贝对象的key、value值,代码如下
// 注意的是:当对象只有一级属性的时候,assign是深拷贝,当对象有多级属性的时候,二级属性后是浅拷贝
let a  = { age : 1 }
let b = Object.assing( {},a)
consloe.log( a===b ) // false
console.log( b.age ) //1
```javascript

```javascript
ES6 的展开运算符也可以实现浅拷贝:...展开对象key,value给新对象
let c = { age : 18 }
let d = { ...a }
console.log( d.age ) // 18
```javascript

// 浅拷贝
let a = ['1' , '2' , '3']
let b = a
console.log( a === b ) //
a[0] = 5
console.log('a',a , 'b',b)
// a(3) [5 , '2' , '3']
// b(3) [5 , '2' , '3']

// 浅拷贝使用场景 如a对象里面的某个key的value值是c,c也是一个对象,对a进行浅拷贝变成b,此时通过对象a来改变对象里的c,那么b里面的c也跟着一起改变
原因是:c是一个对象,引用数据类型,浅拷贝后的b的那个value值是一个引用地址,对象c的地址

// 深拷贝在我们工作中是经常遇到的
// 深拷贝的几种实现方法
//深拷贝第一种方法 我们借用JSON对象的parse和stringify来实现深拷贝
//JSON.stringify与JSON.parse除了实现深拷贝,还可以结合localStroage实现对象数组存储
function deepClone(obj) {
	let _obj = JSON.stringify(obj)
	let objClone = JSON.parse(_obj)
	return objClone
}
let a = ['1','2', ['3','4'],'5']
let b = deepClone(a)
a[0] = 6 
a [2][0] = 7
comsole.log('a',a , 'b', b)
// a (5) [6, '2',/* Array(2)*/[7, '4'], '5']
// b (5) ['1', '2',/* Array(2)*/['3', '4'], '5']```

```javascript
// 深拷贝第二种方法 递归实现深拷贝
function deepCloe(obj) {
let objClone = Array.isArray(obj) ? [] : {}
if( obj && typeof obj === "object" ) {
	for( let key in obj ) {
		if(obj.hasOwnProperty(key) ) {
			if(obj[key] && typeof obj[key] === "object") {
			//判断obj的子对象是不是对象,如果是递归复制
				objClone[key] = deepClone(obj[key])
 				}else{
 				// 如果不是则简单复制
 				objClone[key] = obj[key]
 				}
			}
		}
	}
	return objClone
}

let c = ['1', '2' , '3']
let d = deepClone(c)
c[0] = 6 
console.log('c' ,c 'd', d)
// c(3) [ 6 , '2' , '3']
// d(3) ['1' , '2' , '3']
// 深拷贝第三种方法
function isArray(arr){
  return Object.property.toString.call(arr) === '[Object.Array]'
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值