// 浅拷贝
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]'
}