浅拷贝和深拷贝都是创建一份数据的拷贝。
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;}