浅拷贝的四种方式:

深拷贝:
JS实现深拷贝 https://www.cnblogs.com/dobeco/p/11295316.html
一、赋值、浅拷贝与深拷贝的区别

二、深拷贝的方法
1.JSON转换
var targetObj = JSON.parse(JSON.stringify(copyObj))
let arr4 = JSON.parse(JSON.stringify(arr))
缺点:
(1)如果对象里有函数,函数无法被拷贝下来
(2)无法拷贝copyObj对象原型链上的属性和方法
(3)当数据的层次很深,会栈溢出
2.普通递归函数
function deepCopy( source ) {
if (!isObject(source)) return source; //如果不是对象的话直接返回
let target = Array.isArray( source ) ? [] : {} //数组兼容
for ( var k in source ) {
if (source.hasOwnProperty(k)) {
if ( typeof source[ k ] === 'object' ) {
target[ k ] = deepCopy( source[ k ] )
} else {
target[ k ] = source[ k ]
}
}
}
return target
}
function isObject(obj) {
return typeof obj === 'object' && obj !== null
}
缺点:
(1)无法保持引用
(2)当数据的层次很深,会栈溢出
3.防栈溢出函数
function cloneLoop(x) {
const root = {};
// 栈
const loopList = [
{
parent: root,
key: undefined,
data: x,
}
];
while(loopList.length) {
// 深度优先
const node = loopList.pop();
const parent = node.parent;
const key = node.key;
const data = node.data;
// 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素
let res = parent;
if (typeof key !== 'undefined') {
res = parent[key] = {};
}
for(let k in data) {
if (data.hasOwnProperty(k)) {
if (typeof data[k] === 'object') {
// 下一次循环
loopList.push({
parent: res,
key: k,
data: data[k],
});
} else {
res[k] = data[k];
}
}
}
}
return root;
}
优点:
(1)不会栈溢出
(2)支持很多层级的数据
function copyObject(orig) {
var copy = Object.create(Object.getPrototypeOf(orig));
copyOwnPropertiesFrom(copy, orig);
return copy;
}
function copyOwnPropertiesFrom(target, source) {
Object
.getOwnPropertyNames(source)
.forEach(function (propKey) {
var desc = Object.getOwnPropertyDescriptor(source, propKey);
Object.defineProperty(target, propKey, desc);
});
return target;
}
var obj = {
name: 'Jack',
age: '32',
job: 'developer'
};
var obj2 = copyObject(obj);
console.log(obj2);
obj.age = 39;
obj.name = 'Tom';
console.log(obj);
console.log(obj2);
#Tarjan#洛谷 5676 [GZOI2017]小z玩游戏
#区间dp#CF1114D Flood Fill
#构造,二分#[AGC006B] [AGC006D] Median Pyramid
#0/1分数规划#AT1807 食塩水
#笛卡尔树#洛谷 3793 由乃救爷爷
#同余最短路#洛谷 2371 [国家集训队]墨墨的等式
awk命令使用
k8s快速删除所有退出的pod
ratticdb密码管理工具安装使用
- 最新文章
-
jedis 与 RedisTemplate 操作比较
Lombok依赖
Idea配置功能
势能分析
线性规划
Prufer 序列
矩阵树定理及其证明
Codeforces 1077E Thematic Contests(二分)
#Every-SG#HDU 3595 GG and MM
#Multi-SG#Poj 3537 Crosses and Crosses
- 热门文章
-
#Multi-SG#HDU 5795 A Simple Nim
#Multi-SG#HDU 3032 Nim or not Nim?
#SG函数#HDU 1848 Fibonacci again and again
#整体二分 or 主席树#洛谷 7424 [THUPC2017] 天天爱射击
#根号分治,背包#51nod 1597 有限背包计数问题 LOJ 6089 小Y的背包计数问题
#Pollard-Rho,高精度#洛谷 3499 [POI2010]NAJ-Divine Divisor
#线段树优化建图,Dijkstra#CF786B Legacy
#带权并查集#HDU 3038 How Many Answers Are Wrong
Codeforces Round #670 (Div. 2)
#树状数组#洛谷 6688 可重集
Copyright © 2011-2022 走看看