浅拷贝和深拷贝都是创建一份数据的拷贝。
js分为原始类型和引用类型,对于原始类型的拷贝,并没有深浅拷贝的区别,只有拷贝引用类型的时候存在深浅拷贝的区别的问题。
浅拷贝只进行一层复制,引用类型还是共享内存地址。
深拷贝是无限层级拷贝,深拷贝后对象不会和被拷贝的对象相互影响
js拷贝的方式有哪些:
1. 浅拷贝
- Object.asign({}, obj)
- arr.concat()
- arr.slice()
- lodash.clone()
- 扩展运算符
- 遍历实现
- 深拷贝
-
Object.assign, 对象只有一层时,是深拷贝
-
JSON.parse(JSON.stringify()): 是深拷贝,缺陷:如果值是undefined,Symbol, function值会丢失
-
lodash.cloneDeep
-
递归拷贝
// 迭代递归法:深拷贝对象与数组
function deepCopy(obj) {
if (typeof obj != "object") {
return "need a object";
}
var object = obj.constructor == Array ? [] : {};
for (var i in obj) {
//判断是对象还是普通类型
if (typeof obj[i] == "object") {
//这里需要判断一下是否是正则RegExp 还是 Date 时间
if (obj[i].constructor === RegExp || obj[i].constructor === Date) {
object[i] = obj[i];
} else {
object[i] = deepCopy(obj[i]);
}
} else {
object[i] = obj[i];
}
}
return object;
}