clone&cloneDeep
关于浅拷贝与深拷贝的一些笔记---
浅拷贝
- 直接赋值;
- 任何操作都会影响原数组;
let obj2 = obj1; 复制代码
- Object.assign;
- 拷贝属性值,假如属性值是一个对象的引用,那么也会指向那个引用;
let obj2 = Object.assign({},obj1); 复制代码
- Array.prototype.concat();
- 合并多个数组;
- 拷贝规则同Object.assign;
let arr2 = arr1.concat(...arr); 复制代码
- Array.prototype.slice();
- 提取数组;
- 参数(可选):startIndex,endIndex(与索引值一致);
- 拷贝规则同Object.assign;
let arr2 = arr1.slice(start,end); 复制代码
- 扩展运算符(...);
- 拷贝规则同Object.assign;
let obj2 = {obj1} or [...obj1]; 复制代码
- lodash(_.clone());
- 拷贝规则同Object.assign;
let obj2 = _.clone(obj1); 复制代码
深拷贝
- JSON.parse(JSON.stringify());
- 不能拷贝函数;
let obj2=JSON.parse(JSON.stringify(obj1)); 复制代码
- 递归赋值;
- 额额额...函数是什么---
function deepClone(obj){ let objClone = Array.isArray(obj)?[]:{}; if(obj && typeof obj==="object"){ for(key in obj){ //判断是否为自身属性 if(obj.hasOwnProperty(key)){ //判断ojb子元素是否为对象,如果是,递归复制 if(obj[key]&&typeof obj[key] ==="object"){ objClone[key] = deepClone(obj[key]); }else{ //如果不是,简单复制 objClone[key] = obj[key]; } } } } return objClone; } 复制代码
- lodash(_.cloneDeep());
let obj2 = _.cloneDeep(obj1); 复制代码