js的深拷貝
阿新 • • 發佈:2020-06-30
1. 直接使用JSON.parse(JSON.stringify(Object))來進行
缺點: 如果物件或者數組裡有函式什麼的, 就會出問題啦(也有解決辦法)
2. 使用ES的擴充套件運算子...
let newObj = { ...data }
相當於 let newObj = Object.assign({}, data)
拷貝的屬性是有限制的,基礎資料型別會拷貝一份新的,引用資料型別拷貝的是其地址。
3. 使用函式
// 定義一個深拷貝函式 接收目標target引數
function deepClone(target) { // 定義一個變數 let result; // 如果當前需要深拷貝的是一個物件的話if (typeof target === 'object') { // 如果是一個數組的話 if (Array.isArray(target)) { result = []; // 將result賦值為一個數組,並且執行遍歷 for (let i in target) { // 遞迴克隆陣列中的每一項 result.push(deepClone(target[i])) } // 判斷如果當前的值是null的話;直接賦值為null} else if(target===null) { result = null; // 判斷如果當前的值是一個RegExp物件的話,直接賦值 } else if(target.constructor===RegExp){ result = target; }else { // 否則是普通物件,直接for in迴圈,遞迴賦值物件的所有值 result = {}; for (let i in target) { result[i]= deepClone(target[i]); } } // 如果不是物件的話,就是基本資料型別,那麼直接賦值 } else { result = target; } // 返回最終結果 return result; }