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); 複製程式碼