概念
浅克隆:
直接将存储在栈中的值赋值给对应的变量;如果是基本类型则直接赋值给对应的值;如果是引用类型则赋值的是地址;
深克隆:
就是直接把值赋值给对应的变量,从而产生一个与数据源不同的新数据(数据地址已发生变化),深拷贝就是拷贝各个层级的属性。
浅克隆(=)
1、直接用=进行赋值。如,a=b
2、缺点就是 如果a和b 不是基本类型 那么改变a的时候b也会跟着改变
let arr1 = [1, 2, 3, 4];
let arr2 = arr1;
console.log( arr2 ); // [10, 2, 3, 4]
arr1[0] = 10;
console.log( arr2 ); // [10, 2, 3, 4]
// 在这段代码中,把arr1赋值给arr2,当arr1的值改变时,arr2对应的值也会改变
深克隆
1. 递归法
// 实现深拷贝
function deepClone( obj )
{
// 根据array或者json类型,初始化
let objClone = Array.isArray(obj) ? [] : {};
// 当前object不是null,并且可以是任意object类型
if( obj && typeof obj === "object")
{
// 循环obj中所有的键
// 【array的话,则键是index】
for(key in obj)
{
// 确定obj中包含当前键
if(obj.hasOwnProperty(key))
{
// 当前项key:不是null,也不是初始类型,递归
if(obj[key] && typeof obj[key] === "object")
{
objClone[key] = deepClone(obj[key]);
}
// key:初始类型,则直接复制
else
{
objClone[key] = obj[key];
}
}
}
}
return objClone;
}
2、JSON.stringify 和 JSON.parse
function deepClone( obj )
{
let result = JSON.parse(JSON.stringify(obj))
return result
}
3、jQuery $.extend
let a=[0,1,[2,3],4],
// true: 深拷贝
// false: 浅拷贝
let b=$.extend(true,[],a);
转自:https://www.wolai.com/mary/qH1g6wb4C9EvSZCFFDmpVz