浅拷贝
赋值操作完成的是引用的创建。
深拷贝
数组的深拷贝
对于数组的深拷贝常规的有三种方法:
方法一:遍历赋值
var arr = ["a", "b"],
arrCopy = [];
for (var item in arr) {
arrCopy[item] = arr[item];
}
arrCopy[1] = "c";
arr // => ["a", "b"]
arrCopy // => ["a", "c"]
考虑伪多维数组可以写成函数形式:
function arrDeepCopy(source){
var sourceCopy = [];
for (var item in source) {
sourceCopy[item] =
typeof source[item] === 'object' ?
arrDeepCopy(source[item]) : source[item];
}
return sourceCopy;
}
arrDeepCopy(obj);
这种方法简单粗暴,但是利用JS本身的函数我们可以更加便捷地实现这个操作。
方法二:数组方法
slice(index):从index开始截取数组生成一个新数组。
concat():合并空内容后生成一个新数组。
对象的深拷贝
纯对象
方法一:遍历赋值
var objDeepCopy = function(source){
var sourceCopy = {};
for (var item in source) {
sourceCopy[item] = source[item];
}
return sourceCopy;
}
方法二:使用对象展开运算符
var objTarget = { ...objOrigin }
嵌套对象
方法:
var objDeepCopy = function(source){
var sourceCopy = {};
for (var item in source) {
sourceCopy[item] =
typeof source[item] === 'object' ? objDeepCopy(source[item]) : source[item];
}
return sourceCopy;
}
var objCopy = objDeepCopy(obj);
对象数组的混合
方法:
var objDeepCopy = function (source) {
var sourceCopy = source instanceof Array ? [] : {};
for (var item in source) {
sourceCopy[item] =
typeof source[item] === 'object' ? objDeepCopy(source[item]) : source[item];
}
return sourceCopy;
}
var objCopy = objDeepCopy(obj);
注:Object.assign()只能实现局部深拷贝,即第一层的拷贝。