摘要:定義淺復(fù)制如果復(fù)制引用,復(fù)制后的引用都是指向同一個(gè)對(duì)象的實(shí)例,彼此之間的操作會(huì)互相影響。淺復(fù)制數(shù)組淺復(fù)制利用數(shù)組方法和返回新數(shù)組特性,進(jìn)行復(fù)制。深復(fù)制對(duì)象深復(fù)制利用對(duì)象的和方法。
定義 淺復(fù)制
如果復(fù)制引用,復(fù)制后的引用都是指向同一個(gè)對(duì)象的實(shí)例,彼此之間的操作會(huì)互相影響。
深復(fù)制深復(fù)制不是簡(jiǎn)單的復(fù)制引用,而是在堆中重新分配內(nèi)存,并且把源對(duì)象實(shí)例的所有屬性都進(jìn)行新建復(fù)制,以保證深復(fù)制的對(duì)象的引用圖不包含任何原有對(duì)象或?qū)ο髨D上的任何對(duì)象,復(fù)制后的對(duì)象與原來(lái)的對(duì)象是完全隔離的。
淺復(fù)制 數(shù)組淺復(fù)制利用數(shù)組方法slice和concat返回新數(shù)組特性,進(jìn)行復(fù)制。
var arr = [1,2,3]; var new_arr = arr.concat(); arr[0] = "new"; console.log(new_arr); //[1, 2, 3]
再來(lái)看一組情況:
var arr = [{name: "haha"}, [1,2,3]]; var new_arr = arr.concat(); arr[0].name = "lily"; console.log(new_arr.name); //"lily"
可以看出,如果數(shù)組元素是基本數(shù)據(jù)類型,就會(huì)復(fù)制一份,互不影響,而如果是對(duì)象或者數(shù)組,就會(huì)只復(fù)制對(duì)象和數(shù)組的引用。
擴(kuò)展運(yùn)算符var obj = { name: "jack" }; var a = [1, 2]; var b = [3, obj]; a.push(...b); a // [1, 2, 3, {name: "jack"}] a[3].name = "rose"; b // [3, {name: "rose"}]Object.assign
var obj = { name: "jack" }; var copyObj = Object.assign({}, obj); obj.name = "rose"; copyObj // {name: "rose"}自定義淺復(fù)制
function shallowCopy(obj) { if (typeof obj !== "object") return; var new_obj = obj instanceof Array ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { new_obj[key] = obj[key]; } } return new_obj; } var source = { name: "source", child: { name:"child" }, arr: [1,2,34], setName: function() { this.name = "haha"; } }; var target = shallowCopy(source); console.log(target); //Object {name: "source", child:{ name:"child"}, arr: [1,2,34], setName: function } source.child.name = "lily"; console.log(target.child.name); //"lily" source.name = "sam"; console.log(target.name); //"source" source.arr[0] = 5; console.log(target.arr); //"5,2,34" source.setName = function() { console.log(this.name); }; console.log(target.setName ); //function(){ this.name = "haha"; }
由此可以看出,此方法確實(shí)可以復(fù)制object和array對(duì)象,但無(wú)法進(jìn)行深復(fù)制;但是可以復(fù)制function。
深復(fù)制 對(duì)象深復(fù)制利用JSON對(duì)象的parse和stringify方法。
var source = { name: "source", child: { name:"child" }, arr: [1,2,34], setName: function() { this.name = "haha"; } }; var target = JSON.parse(JSON.stringify(source)); console.log(target); //Object {name: "source", child:{ name:"child"}, arr:[1,2,34] } source.child.name = "lily"; console.log(target.name); //"child" source.arr[0] = 5; console.log(target.arr); //"1,2,34"
由此可以看出,雖然此方法確實(shí)可以復(fù)制object和array對(duì)象,并且進(jìn)行了深復(fù)制,卻無(wú)法復(fù)制function。
自定義深復(fù)制function deepCopy(obj) { if (typeof obj !== "object") return; var new_obj = obj instanceof Array ? [] : {}; for (var key in obj) { if (obj.hasOwnProperty(key)) { new_obj[key] = typeof obj[key] === "object" ? deepCopy(obj[key]) : obj[key]; } } return new_obj; } var source = { name: "source", child: { name:"child" }, arr: [1,2,34], setName: function() { this.name = "haha"; } }; var target = deepCopy(source); console.log(target); //Object {name: "source", child:{ name:"child"}, arr: [1,2,34], setName: function } source.child.name = "lily"; console.log(target.child.name); //"child" source.name = "sam"; console.log(target.name); //"source" source.arr[0] = 5; console.log(target.arr); //"1,2,34" source.setName = function() { console.log(this.name); }; console.log(target.setName ); //function(){ this.name = "haha"; }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/89343.html
摘要:設(shè)計(jì)模式資源整理操作符小知識(shí)點(diǎn)實(shí)現(xiàn)發(fā)郵件功能數(shù)據(jù)結(jié)構(gòu)與算法資源整理跨域函數(shù)的合成與柯里化系列之防抖節(jié)流系列之正則系列之系列之系列之編碼系列之系列之操作符對(duì)象中的坐標(biāo)檢測(cè)對(duì)象或數(shù)組系列之機(jī)制系列之構(gòu)造對(duì)象系列之總結(jié)系列之淺復(fù)制與深復(fù)制系列之對(duì) Javascript設(shè)計(jì)模式資源整理JS操作符JS小知識(shí)點(diǎn)JS實(shí)現(xiàn)發(fā)郵件功能數(shù)據(jù)結(jié)構(gòu)與算法資源整理跨域函數(shù)的合成與柯里化JS系列之防抖節(jié)流JS系列...
摘要:淺拷貝深拷貝淺拷貝的問題如果父對(duì)象的屬性等于數(shù)組或另一個(gè)對(duì)象,那么實(shí)際上,子對(duì)象獲得的只是一個(gè)內(nèi)存地址,而不是真正拷貝,因此存在父對(duì)象被篡改的可能。 淺拷貝: function extendCopy(p) { var c = {}; for (var i in p) { c[i] = p[i]; } return c; } 深拷貝: function deepCopy(p...
摘要:前言里面淺拷貝和深拷貝是非常關(guān)鍵的知識(shí)點(diǎn),今天就來(lái)通過本文清楚的了解深淺拷貝以及該如何實(shí)現(xiàn)這兩種拷貝方式。對(duì)象的拷貝又分為淺拷貝和深拷貝。印證了上述所說的對(duì)于所有的基本類型,簡(jiǎn)單的賦值已經(jīng)是實(shí)現(xiàn)了深拷貝。 前言 JavaScript里面淺拷貝和深拷貝是非常關(guān)鍵的知識(shí)點(diǎn),今天就來(lái)通過本文清楚的了解深淺拷貝以及該如何實(shí)現(xiàn)這兩種拷貝方式。 深淺拷貝的區(qū)別 拷貝:其實(shí)就是一個(gè)對(duì)象復(fù)制給另外...
摘要:棧內(nèi)存與堆內(nèi)存淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。棧內(nèi)存與堆內(nèi)存中的變量分為基本類型和引用類型。 showImg(https://segmentfault.com/img/bVbuvnj?w=900&h=250); 前言 想寫好前端,先練好內(nèi)功。 棧內(nèi)存與堆內(nèi)存 、淺拷貝與深拷貝,可以說是前端程序員的內(nèi)功,要知其然,知其所以然。 筆者寫的 JavaScrip...
摘要:所以,深拷貝是對(duì)對(duì)象以及對(duì)象的所有子對(duì)象進(jìn)行拷貝實(shí)現(xiàn)方式就是遞歸調(diào)用淺拷貝對(duì)于深拷貝的對(duì)象,改變?cè)磳?duì)象不會(huì)對(duì)得到的對(duì)象有影響。 為什么會(huì)有淺拷貝與深拷貝什么是淺拷貝與深拷貝如何實(shí)現(xiàn)淺拷貝與深拷貝好了,問題出來(lái)了,那么下面就讓我們帶著這幾個(gè)問題去探究一下吧! 如果文章中有出現(xiàn)紕漏、錯(cuò)誤之處,還請(qǐng)看到的小伙伴多多指教,先行謝過 以下↓ 數(shù)據(jù)類型在開始了解 淺拷貝 與 深拷貝 之前,讓我們先...
閱讀 2544·2021-11-24 10:20
閱讀 2392·2021-09-10 10:51
閱讀 3381·2021-09-06 15:02
閱讀 3114·2019-08-30 15:55
閱讀 2841·2019-08-29 18:34
閱讀 3080·2019-08-29 12:14
閱讀 1218·2019-08-26 13:53
閱讀 2931·2019-08-26 13:43