对于网上深浅拷贝的定义观点各不一致,有点误人子弟!
在此写这篇文章也是为了帮助大家更好的做区分和理解
浅拷贝是指对象复制的时候只复制一层
深拷贝是指复制对象的所有层级,不共享内存(修改新对象不会改到原对象)
const obj = { name: '张三' };
const newObj = obj;
const obj = { name: '张三' };
const newObj = Object.assign(obj,{});
const obj = { name: '张三' };
const newObj = {...obj};
const obj = { name: '张三' };
const newObj = {};
for(let key in obj){
newObj[key] = obj[key]
}
const obj = { name: '张三' };
const newObj = JSON.parse(JSON.stringify(obj));
简易版,还有很多因素没考虑到(慎用)
function deepClone(obj) {
// 数组, 对象, null通过 typeof 检测都为 object
if ((typeof obj !== 'object') || obj === null) return obj;
let result = new obj.constructor // 另一种方式 Array.isArray(obj) ? [] :{}
for (let key in obj) {
// 判断对象自身属性中是否具有指定的属性
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key]) // 递归
}
}
return result
}
需考虑浏览器兼容问题,Function和Dom节点拷贝不了
const obj = { name: '张三' };
const newObj = structuredClone(obj)
const arr = [ 1, 2 ]
const newArr = arr
const arr = [ 1, 2 ]
const newArr = arr.slice()
const arr = [ 1, 2 ]
const newArr = [...arr]
const arr = [ 1, 2 ]
const newArr = arr.concat()
const arr = [ 1, 2 ]
const newArr = JSON.parse(JSON.stringify(arr));