摘要:開門見山,有人叫對象的復制為深復制淺復制,也有人叫深拷貝淺拷貝。高級屬性修改深拷貝滿足對象的復制,淺拷貝影響原數組。關于對象的深淺拷貝,暫且探索到這里,后續有新發現再進行補充。
開門見山,有人叫對象的復制為深復制淺復制,也有人叫深拷貝淺拷貝。
其實都是copy。
深拷貝(遞歸復制,復制所有層級,獨立副本,一個完全和原來對象屬性無關的副本)
返回對象:一個。
傳入對象:一個。
條件:JSON安全的對象,可以序列化為JSON字符串,并且可以解析為新的字符串。
深拷貝算法:
</>復制代碼
function deepCopy(data){
let memory = null;
const type = Object.prototype.toString.call(data);
if (type === "[object Array]"){
memory = []
for (let i=0 ;i{
memory[key] = data[key]
})
}else{
return data;
}
return memory;
}
jQuery深拷貝:
var copiedObject = jQuery.extend(true, {}, originalObject)
es6深拷貝:
var copiedObject= JSON.parse(JSON.stringify(originalObject));
深拷貝是遞歸復制,新復制的對象與原對象是完全獨立的兩個對象,它們指向不同的內存地址,做set不會影響到對方。
淺拷貝(單次復制,復制最高層級,引用副本,一個基于對原對象屬性引用的副本)
返回對象:一個。
傳入對象:一個或多個。
條件:無。
jQuery淺拷貝:
var copiedObject = jQuery.extend({}, originalObject)
es6淺拷貝:
var copiedObject = Object.assign({},originalObject)
es7淺拷貝:
var copiedObject = {...originalObject}
淺拷貝算法:
</>復制代碼
function shallowCopyObj(original){
let copy = {}
Object.keys(original).forEach(key=>{
copy[key] = original[key]
})
return copy
}
由于javascript的對象是存地址的,所以淺復制的對象與原對象,都指向同一個內存地址,屬于引用復制,做set會影響到對方。
實驗:
①普通屬性修改:深拷貝和淺拷貝都可以滿足對象的復制。
普通屬性是指value值為非Array,Object類型的數據類型,也就是Number,String,Boolean等基本數據類型。
原因:基本數據類型屬于值傳遞。
</>復制代碼
var obj = {foo:1};
var deepCopyObj = JSON.parse(JSON.stringify(obj));
deepCopyObj.foo = 2;
console.log("obj.foo:",obj.foo);//1
console.log("deepCopyObj.foo:",deepCopyObj.foo);//2
</>復制代碼
var obj = {foo:1};
var shallowCopyObj = Object.assign({},obj);
shallowCopyObj.foo = 2;
console.log("obj.foo:",obj.foo);//1
console.log("shallowCopyObj.foo:",shallowCopyObj.foo);//2
②高級屬性修改:深拷貝滿足對象的復制,淺拷貝影響原數組。
高級屬性是指Array,Object數據類型。
原因:基本數據類型屬于引用傳遞。
</>復制代碼
var obj = {foo:1,bar:{baz:1}};
var deepCopyObj = JSON.parse(JSON.stringify(obj));
deepCopyObj.bar.baz = 2;
console.log("obj.bar.baz:",obj.bar.baz);//1
console.log("deepCopyObj.bar.baz:",deepCopyObj.bar.baz);//2
</>復制代碼
var obj = {foo:1,bar:{baz:1}};
var shallowCopyObj = Object.assign({},obj);
shallowCopyObj.bar.baz = 2;
console.log("obj.bar.baz:",obj.bar.baz);//2 Attention!
console.log("shallowCopyObj.bar.baz:",shallowCopyObj.bar.baz);//2
印象中const也是保持變量地址不變的操作,那么es6中的let和const對于對象的深淺拷貝有影響嗎?
也就是將上面代碼中的var替換為let和const。
實驗結果是let和const不會影響深淺拷貝的結果,因為let強調塊作用域,而const強調變量整體地址空間的不變性。
關于對象的深淺拷貝,暫且探索到這里,后續有新發現再進行補充。
謝謝您的閱讀~
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/94138.html
摘要:什么是深淺概念深拷貝淺拷貝只針對像這樣的對象,對于基本類型而言,可以理解為是沒有深淺的區別的。和指向了同一塊內存深拷貝重新開辟了一個空間,修改對象的屬性,彼此不會影響。并不會更改使用遞歸適用于對象里面有對象 什么是深淺 概念 深拷貝、淺拷貝只針對像Object/Array這樣的對象,對于基本類型而言,可以理解為是沒有深淺的區別的。 淺拷貝復制的是引用,修改對象的屬性,會彼此影響。 ju...
摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實現深淺拷貝的思路前言拷貝也是面試經典吶數組的淺拷貝如果是數組,我們可以利用數組的一些方法比如返回一個新數組的特性來實現拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實現深淺拷貝的思路 前言 拷貝也是面試經典吶! 數組的淺拷貝 如果是數組,我們可以利用數組的一些方法比如:slice、co...
摘要:為何寫最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內存中,將的各個屬性都復制到新內存里,就是深拷貝。安全的值是指能夠呈現為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實現 為何寫: 最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。廢話不多說,我們來一起復習一下吧,也希望留下您寶貴意見。 何為深淺拷貝?...
摘要:基本類型指的是簡單的數據段,而引用類型指的是一個對象保存在堆內存中的地址,不允許我們直接操作內存中的地址,也就是說不能操作對象的內存空間,所以,我們對對象的操作都只是在操作它的引用而已。 工作中經常會遇到需要復制 JavaScript 數據的時候,遇到 bug 時實在令人頭疼;面試中也經常會被問到如何實現一個數據的深淺拷貝,但是你對其中的原理清晰嗎?一起來看一下吧! 一、為什么會有深淺...
閱讀 3759·2021-08-11 11:16
閱讀 1630·2019-08-30 15:44
閱讀 2000·2019-08-29 18:45
閱讀 2282·2019-08-26 18:18
閱讀 1011·2019-08-26 13:37
閱讀 1576·2019-08-26 11:43
閱讀 2125·2019-08-26 11:34
閱讀 382·2019-08-26 10:59
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要