深浅拷贝指的是拷贝内容。深拷贝就是在堆内存中完全开辟一份新的空间存储被拷贝的内容;浅拷贝只拷贝了一层,对象数组的拷贝方法就属于浅拷贝。
1. 常见的浅拷贝
(1) 数组api:
Array.prototype.concat()
Array.prototype.slice()
Array.prototype.from()
(2) 对象api:
Object.assign(obj1,obj2);
Object.getOwnPropertyNames(obj);
Object.keys(obj);
(3) rest运算符:
[...list] {...list}
2. 深拷贝
(1) JSON.parse(JSON.Stringfy())
如果obj里有函数,undefined,则序列化的结果会把函数或 undefined丢失。如果操作对象有循环属性会报错。
基于各种各样的问题,往往需要手写一个递归函数处理,判断各种情况。
(2) 递归函数
// 1. 封装一个函数,实现传入一个对象返回一个拷贝后的新对象
function cloneObj(obj) {
// 根据不同类型设置不同的初始化
if (obj instanceof Array) {
var clone = [];
} else {
var clone = {};
}
//使用for...in
for (let i in obj) {
// 如果为对象则递归更进一层去拷贝
if (typeof obj[i] == "object" && obj[i] != null) {
clone[i] = cloneObj(obj[i]);
} else {
// 否则存进变量
clone[i] = obj[i];
}
}
//循环结束后输出
return clone;
}