深拷贝
前言
为了学习
<!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>深拷贝</title>
</head>
<body>
<script crossorigin="anonymous"
integrity="sha512-n/4gHW3atM3QqRcbCn6ewmpxcLAHGaDjpEBu4xZd47N0W2oQ+6q7oc3PXstrJYXcbNU1OHdQ1T7pAP+gi5Yu8g=="
src="https://lib.baomitu.com/jquery/3.6.0/jquery.js"></script>
<script>
let obj = {
a: 1,
b: {
c: 5,
d: {
e: 2,
p: new Date(),
o: function () {
return 123
}
}
}
};
// // function deepClone(obj) {
// // let newObj
/* 这里考虑Date、RegExp */
// // if (obj instanceof Date) return new Date(obj)
// // if (obj instanceof RegExp) return new RegExp(obj)
/* 判断是否是基本数据类型、如果是就return 基本数据类型不存在地址引用 */
// // if (typeof obj !== "object" || obj !== null) return obj
// // if (obj instanceof Array) {
// // newObj = []
// // }
// // if (obj instanceof Object) {
// // newObj = {}
// // }
// // for (let key in obj) {
// // newObj[key] = deepClone(obj[key])
// // }
// // return newObj
// // }
// function deepClone(obj, newObj1) {
// let newObj = newObj1 || {}
// for (let i in obj) {
// if (typeof obj[i] === "object" && obj[i] !== null) {
// /* 不考虑reg date */
// /* 走到这里说明当前数据还是复杂数据类型 如果直接赋值 就出现了地址传递 只是把指针复制了一份 地址没有变 一个数据改变了 另一个数据还是会改变 */
// /* 每次都先把新对象的属性值置空 如果不置空 新对象身上没有这个对应的属性 */
// newObj[i] = {}
// /* 在此调用递归 */
// deepClone(obj[i], newObj[i])
// } else {
// /* 走到这里就说明obj[i]就是基本数据类型了 基本数据类型不存在地址传递,只有值传递 */
// newObj[i] = obj[i]
// }
// }
// return newObj
// }
// let newObj = deepClone(obj)
// obj.b.d.e = 6
// obj.b.d.o = function () {
// return 453
// }
/* 第三种用jQuery的extend 深拷贝 */
// function deepClone(obj) {
// return $.extend(true, {}, obj)
// }
/* 第四种用JSON.parse JSON.stringify */
function deepClone(obj) {
/* 这种会有BUG stringify不会识别fun Date Reg */
return JSON.parse(JSON.stringify(obj))
}
let newObj = deepClone(obj)
obj.b.d.e = 55
console.log(obj)
console.log(newObj)
</script>
</body>
</html>