摘要:什么是深淺概念深拷貝淺拷貝只針對(duì)像這樣的對(duì)象,對(duì)于基本類型而言,可以理解為是沒有深淺的區(qū)別的。和指向了同一塊內(nèi)存深拷貝重新開辟了一個(gè)空間,修改對(duì)象的屬性,彼此不會(huì)影響。并不會(huì)更改使用遞歸適用于對(duì)象里面有對(duì)象
什么是深淺 概念
深拷貝、淺拷貝只針對(duì)像Object/Array這樣的對(duì)象,對(duì)于基本類型而言,可以理解為是沒有深淺的區(qū)別的。
淺拷貝復(fù)制的是引用,修改對(duì)象的屬性,會(huì)彼此影響。
just like this
let a = {name: "ziv"} let b = a // a和b指向了同一塊內(nèi)存 b.name = "lucky" console.log(a.name) // "lucky" console.log(b.name) // "lucky"
深拷貝重新開辟了一個(gè)空間,修改對(duì)象的屬性,彼此不會(huì)影響。
實(shí)現(xiàn)淺拷貝 使用內(nèi)置的方法// Object.assign() //只能用于淺拷貝對(duì)象或者合并對(duì)象 let obj = {a:"x", b: {c: "y"}} let newObj = Object.assign({}, obj) obj.b.c = "z" console.log(newObj) // {a:"x", b: {c: "z"}} // Array.from() // ...操作符 // slice() // concat() 用于數(shù)組 let arr = [1,2, [3,4,5]] let sliceArr = arr.slice() let concatArr = arr.concat() let fromArr = Array.from(arr) let newArr = [...arr] arr[2][1] = "sixsix" console.log(sliceArr) // [1,2,[3,"sixsix",5]] console.log(concatArr) // [1,2,[3,"sixsix",5]] console.log(fromArr) // [1,2,[3,"sixsix",5]]使用遍歷
// 對(duì)象淺拷貝 let shallowCopy = function(obj) { // 如果不是對(duì)象,不執(zhí)行拷貝 if (typeof obj !== "object") return // 判斷對(duì)象是數(shù)組還是對(duì)象 let newObj = obj instanceof Array ? [] : {} // 遍歷obj for (let key in obj) { if (obj.hasOwnProperty(key)) { // 拷貝到新對(duì)象中 newObj[key] = obj[key] } } return newObj }實(shí)現(xiàn)深拷貝 序列化反序列化
// 適用于數(shù)組還有對(duì)象,但是對(duì)于函數(shù)對(duì)象、正則對(duì)象、稀疏數(shù)組等無法進(jìn)行深拷貝(而且會(huì)直接丟失相應(yīng)的值),并且會(huì)拋棄對(duì)象的constructor,也就是說無論這個(gè)函數(shù)的構(gòu)造函數(shù)是誰,使用這種拷貝之后,constructor都會(huì)變成Object。對(duì)循環(huán)引用同樣無法處理。 let arr = ["old", 1, true, ["old1", "old2"], {old: 1}] let new_arr = JSON.parse(JSON.stringify(arr)) arr[3][0] = "new1" // new_arr并不會(huì)更改 console.log(new_arr)使用遞歸
// 適用于對(duì)象里面有對(duì)象 let deepCopy = function(obj) { if (typeof obj !== "object") return obj let newObj = obj instanceof Array ? [] : {} for (let key in obj) { if (obj.hasOwnProperty(key)) { newObj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key] } } return newObj }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/93873.html
摘要:開門見山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。高級(jí)屬性修改深拷貝滿足對(duì)象的復(fù)制,淺拷貝影響原數(shù)組。關(guān)于對(duì)象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000014305581); 開門見山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。其實(shí)都是copy。 ...
摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路前言拷貝也是面試經(jīng)典吶數(shù)組的淺拷貝如果是數(shù)組,我們可以利用數(shù)組的一些方法比如返回一個(gè)新數(shù)組的特性來實(shí)現(xiàn)拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路 前言 拷貝也是面試經(jīng)典吶! 數(shù)組的淺拷貝 如果是數(shù)組,我們可以利用數(shù)組的一些方法比如:slice、co...
摘要:為何寫最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內(nèi)存中,將的各個(gè)屬性都復(fù)制到新內(nèi)存里,就是深拷貝。安全的值是指能夠呈現(xiàn)為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實(shí)現(xiàn) 為何寫: 最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。廢話不多說,我們來一起復(fù)習(xí)一下吧,也希望留下您寶貴意見。 何為深淺拷貝?...
摘要:深復(fù)制實(shí)現(xiàn)代碼如下第一種方法通過遞歸解析解決第二種方法通過解析解決作者六師兄鏈接原生深拷貝的實(shí)現(xiàn)處理未輸入新對(duì)象的情況通過方法構(gòu)造新的對(duì)象 深淺拷貝針對(duì)的是 對(duì)象類型,如果是字符串的數(shù)組用[...arr],還是不會(huì)影響 要區(qū)分針對(duì)數(shù)組的深淺拷貝(默認(rèn)情況為里面沒有對(duì)象的數(shù)組),與針對(duì)對(duì)象的深淺拷貝 JavaScript數(shù)組深拷貝和淺拷貝的兩種方法 let a1 = [1, 2]; ...
摘要:基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對(duì),這類引用類型數(shù)據(jù)。它會(huì)拋棄對(duì)象的。另外,查資料過程中還看到這么一個(gè)詞結(jié)構(gòu)化克隆算法還有這一篇資料也有參考,也寫得比較詳細(xì)了的深淺拷貝 基本數(shù)據(jù)類型的復(fù)制很簡單,就是賦值操作,所以深淺拷貝也是針對(duì)Object,Array這類引用類型數(shù)據(jù)。 淺拷貝對(duì)于字符串來說,是值的復(fù)制,而對(duì)于對(duì)象來說則是對(duì)對(duì)象地址的復(fù)制;而深拷貝的話,它不...
閱讀 635·2023-04-26 01:53
閱讀 2760·2021-11-17 17:00
閱讀 2895·2021-09-04 16:40
閱讀 1995·2021-09-02 15:41
閱讀 844·2019-08-26 11:34
閱讀 1234·2019-08-26 10:16
閱讀 1342·2019-08-23 17:51
閱讀 830·2019-08-23 16:50