<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<script>
// 藕断丝连是浅拷贝 不影响原数组是深拷贝
// 基本数据类型赋值 深拷贝
// let a = 1
// let b= a
// b=3
// console.log(a,b);
// 数组对象的赋值浅拷贝
// let arr = [1,2,3]
// let newArr = arr
// newArr.push(4)
// console.log(arr,newArr);
// 解构赋值是深是浅 一维数组是深拷贝
// let arr2 = [1,2,3]
// let newArr2 = [...arr2]
// newArr2.push(4)
// console.log(arr2,newArr2);
// 二维数组是浅拷贝
// let arr3 = [[1,2,3],[2,1]]
// let newArr3 = [...arr3]
// newArr3[1].push(5555)
// console.log(arr3,newArr3);
// 深拷贝
// 缺陷 方法不能拷贝 日期对象不能深拷贝
// let list = [
// {name: '牛',age:15},
// {name: '蝴',age:151},
// {name: '猪',age:12},
// {name: '胡',age:125}
// ]
// let newList = JSON.parse(JSON.stringify(list))
// newList.push({id: 888})
// console.log(list,newList);
let objc = {
a:121,
c:{P:12,f:23},
arr:[1,3,54,76]
}
// 标准的深拷贝(递归) =>针对 引用数据类型(数组对象)
// []=>Array 基类 {}=>object
function deepClone(source) {
// 用变量装 起来判断它的基类
const targetObj = source.constructor === Array ? {} : []
for(let keys in source){
if (source.hasOwnProperty(keys)) {
// 判读key的3种情况
if(source[keys] && typeof source[keys] === 'object'){
targetObj[keys] = source[keys].constructor === Array ? {} : []
targetObj[keys] = deepClone(source[keys])
}else{
targetObj[keys] = source[keys]
}
}
}
return targetObj
}
let asd = deepClone(objc)
asd.a = '行不相信';
asd.c.push('三百')
console.log(asd.c);
console.log(asd,objc);
</script>
</body>
</html>