手写JS深拷贝
2024-10-21 06:06:14
<!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>JS深拷贝</title>
</head>
<body> </body>
<script>
let obj = {
name: '张三',
age:22,
arr: [1,2,'dadas'],
where: {
country1: '中国',
country2: '府谷',
}
} function deepClone(obj) {
if(obj === null || typeof obj !== 'object') {
return obj;
}
let result;
if(obj instanceof Array) {
result = []
} else {
result = {}
}
for(let key in obj) {
if(obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])
}
}
return result
} let newObj = deepClone(obj);
console.log(newObj);
newObj.name = 999;
console.log(newObj);
console.log(obj); </script>
</html>
方法二:
- 函数 正则 日期 ES6新对象 等不是直接返回其地址,而是重新创建
- 需要避免出现循环引用的情况
const _completeDeepClone = (target, map = new WeakMap()) => {
// 基本数据类型,直接返回
if (typeof target !== 'object' || target === null) return target
// 函数 正则 日期 ES6新对象,执行构造题,返回新的对象
const constructor = target.constructor
if (/^(Function|RegExp|Date|Map|Set)$/i.test(constructor.name)) return new constructor(target)
// map标记每一个出现过的属性,避免循环引用
if (map.get(target)) return map.get(target)
map.set(target, true)
const cloneTarget = Array.isArray(target) ? [] : {}
for (prop in target) {
if (target.hasOwnProperty(prop)) {
cloneTarget[prop] = _completeDeepClone(target[prop], map)
}
}
return cloneTarget
}
最新文章
- Keep-Alive 总结
- 让python在hadoop上跑起来
- 客户端安全-xss-1类型介绍
- 阿里云中Centos下配置防火墙
- IOS判断app在appstore是否有可用的更新
- 第七章:Javascript数组
- JavaScript高级---桥模式设计
- Spring AOP实现方式二【附源码】
- Ubuntu下java环境的搭建
- Java思维导图之Class对象
- 零基础实现node+express个性化聊天室
- centos7系统服务管理
- 【Spark篇】---Spark中广播变量和累加器
- 改善Python程序的条条建议
- 转载--无弹窗APT渗透实验
- 利用python中的gensim模块训练和测试word2vec
- stl源码剖析 详细学习笔记 hashtable
- Linux内核分析(第三周)
- php排序学习之-冒泡排序
- 【大数据系列】hadoop单节点安装官方文档翻译