JS中深拷貝和淺拷貝差異?
兩者的區別在於是否是真正獲取了一個對象的複製實體,而不是引用,深拷貝在計算機中開闢了一塊內存地址用於存放複製的對象,而淺拷貝僅僅是指向被拷貝的記憶體位址,如果原始位址中物件被改變了,那麼淺拷貝出來的物件也會隨之改變。
深拷貝
最簡單的方法就是
JSON.parse(JSON.stringify()) function deepCopy(o) { return JSON.parse(JSON.stringify(o)) } var c = { age: 1, name: undefined, sex: null, tel: /^1[34578]\d{9}$/, say: () => { console.log('hahha') } } // { age: 1, sex: null, tel: {} }
#要注意的是:這個拷貝方法不可以拷貝一些特殊的屬性(例如正規表示式,undefine,function)
用遞歸去複製所有層級屬性
function deepCopyTwo(obj) { let objClone = Array.isArray(obj) ? [] : {}; if (obj && typeof obj == 'object') { for (const key in obj) { //判断obj子元素是否为对象,如果是,递归复制 if (obj[key] && typeof obj[key] === "object") { objClone[key] = deepCopyTwo(obj[key]); } else { //如果不是,简单复制 objClone[key] = obj[key]; } } } return objClone; }
淺拷貝
object.assign(target,source)
Object .assign 方法只複製來源物件中可列舉的屬性和物件本身的屬性
如果目標物件中的屬性具有相同的鍵,則屬性將被來源中的屬性覆寫。後來的來源的屬性將類似地覆寫早先的屬性
Object.assign 會跳過那些值為[null] null 是一個JavaScript 字面量,表示空值(null or an "empty" value),即沒有物件被呈現(no object value is present)。它是 JavaScript 原始值 之一。 ") 或 undefined 的來源物件。
推薦教學:《JS教學》
以上是JS中深拷貝和淺拷貝差別?的詳細內容。更多資訊請關注PHP中文網其他相關文章!