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