摘要:引用類型拷貝如果想要對引用類型進行拷貝,使拷貝之后的結果互不影響的話,需要在拷貝時新增一個堆內存,將原始堆內存中的數據復制進去,同時新分配的棧內存存儲新的堆內存地址。
1.基本數據類型以及引用類型基礎:
2.賦值拷貝圖解:
基本數據類型: ``` var a = 123; var b = a; ```
第一步:給a分配一個棧內存:
第二步:給b分配一個棧內存,將a中的數據拷貝出來:
因此,基本數據類型賦值拷貝之后兩個變量互相不影響
引用類型: ``` var a = [qqq]; var b = a ```
第一步:分配一個堆內存,存儲數據,分配一個棧內存,存儲a對應的數據的堆內存地址(堆1),a可以根據地址找到相應的數據:
第二步:給b分配一個棧內存,存儲對應的堆內存地址(還是堆1),b也可以根據地址找到相應的數據。
當a或者b改變時,改變的是堆內存里面的數據,棧內存里的地址沒有改變,因此引用類型賦值拷貝之后兩個變量是相互影響的,一個變量改變會導致另一個變量的改變。
3.引用類型拷貝
如果想要對引用類型進行拷貝,使拷貝之后的結果互不影響的話,需要在拷貝時新增一個堆內存,將原始堆內存中的數據復制進去,同時新分配的棧內存存儲新的堆內存地址。
4.深拷貝的方式
1.利用json進行轉化
var a = JSON.stringify(b); var c = JSON.parse(a); //將b拷貝給c
將b轉化為字符串賦值給a,然后將a再轉化為json賦予c
弊端:只能轉化只有基礎類型的對象,包含引用類型嵌套時不能使用
2.利用數組中的slice和concat方法
var a = ["1","2","3"]; var b = a.slice(0); b[1] = "4"; //a = ["1","2","3"],b = ["1","4","3"] var c = a.concat(); c[0] = "5"; //a = ["1","2","3"],c = ["5","2","3"]
弊端:無法切斷引用類型嵌套時的關聯,slice和concat類似
var aa = ["1",["1","2"],"3"]; var bb = aa.slice(0); bb[1][1] = "33"; //aa=["1",["1","33"],"3"],此時嵌套的數據會被修改 bb[1] = "33"; //aa=["1",["1","33"],"3"],bb=["1", "33", "3"],此時嵌套的數據不會被修改
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/106319.html
摘要:一棧數據結構與不同,中并沒有嚴格意義上區分棧內存與堆內存。引用數據類型的值是保存在堆內存中的對象。不允許直接訪問堆內存中的位置,因此我們不能直接操作對象的堆內存空間。為了更好的搞懂變量對象與堆內存,我們可以結合以下例子與圖解進行理解。 showImg(https://segmentfault.com/img/remote/1460000009784102?w=1240&h=683); ...
摘要:相當于相當于相當于基礎類型不屬于包裝的對象類型小結數據類型是每一個語言的基礎由于屬于弱類型腳本語言因此數據只有在賦值后才能直到變量的數據類型下一次我們具體介紹對象的概念 前言 在《你所不知道的javascript上篇》書籍 以及《javascript權威指南》等書籍里面, 均有介紹js的數據類型,對象,原型,繼承。結合工作經驗, 以及借用一些開源庫和框架的源碼, 進行一次梳理。 首先介...
摘要:平時在復習基礎知識時,經常會遇到數據類型基礎數據類型內置對象包裝類型對象,檢測數據類型時,用到的值,感覺都差不多,但是又有差異。值與數據類型關系對比下圖,即可知值相較于基礎數據類型少多 平時在復習JS基礎知識時,經常會遇到JS數據類型、基礎數據類型、內置對象、包裝類型對象,檢測數據類型時,用到的typeof值,感覺都差不多,但是又有差異。今天特地整理下,方便理解。 JS數據類型 基礎數...
摘要:值類型與引用類型值類型引用類型值類型引用類型類型轉換字符串拼接運算符語句邏輯運算字符串拼接運算符語句邏輯運算符判斷一個變量會被當做還是區分和會發生類型轉換,沒有類型轉換。 1.數據類型 ECMAScript定義了6種數據類型,包括: 基本數據類型:Undefined、Null、Boolean、Number、String; 復雜數據類型:Object; 2.typeof操作符 typ...
摘要:構造函數構造函數名大寫即使不寫,構造函數也默認返回,最好不寫創建實例執行過程變成空對象屬性賦值賦值給擴展引用類型都有構造函數本質是的語法糖判斷引用類型屬于哪個構造函數,例判斷邏輯的一層一層向上找,能否對應到原型規則以下所說的引用類型均指對象 1.構造函數: function Foo(name,age){// Foo構造函數名大寫 this.name =name; thi...
閱讀 2882·2021-09-28 09:36
閱讀 3608·2021-09-27 13:59
閱讀 2484·2021-08-31 09:44
閱讀 2278·2019-08-30 15:54
閱讀 2352·2019-08-30 15:44
閱讀 1180·2019-08-30 13:45
閱讀 1223·2019-08-29 18:38
閱讀 1207·2019-08-29 18:37