深拷贝
概念:深拷贝是开辟一个新的空间来存储数据、修改一个空间的数据另一个空间的数据不会发生改变!
常见的深拷贝的方式
- _.cloneDeep()
- jQuery.extends()
- JSON.stringify()
- 手写递归的方式
_.cloneDeep()
// 首先这个我们需要自己引入 lodash 安装等
const _ = require('lodash')
const obj1 = {
name:'qc',
age:18
}
const obj2 = _.cloneDeep(obj1)
jQuery.extends()
// 首先这个我们需要自己引入 jQuery 安装等
const $ = require('jquery');
const obj1 = {
a: 1,
b: { f: { g: 1 } },
c: [1, 2, 3]
};
const obj2 = $.extend(true, {}, obj1);
console.log(obj1.b.f === obj2.b.f); // false
JSON.stringify()
const obj1 = {
name:'qc',
age:18
}
const obj2 = JSON.parse(JSON.stringify(obj1))
console.log(obj2 == obj1) // false
obj1.name = 'xym'
console.log(obj2.name) // qc
但是这种方式存在弊端,会忽略undefined
、symbol
和函数
手写递归的方式
function deepCopy(obj){
// 判断 obj 是不是对象类型,null除外
if(obj == null || typeof obj !== 'object') return obj
// 判断 obj 是不是数组
const copy = Array.isArray(obj) ? [] : {}
Object.keys(obj).forEach((key) => {
// 判断 key 是不是 obj 本身的属性
if(obj.hasOwnProperty(key)){
copy[key] = deepCopy(obj[key])
}
})
return copy
}