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