摘要:實(shí)際上,是禁止這樣做的。傳值和傳址基本數(shù)據(jù)類型賦值基本數(shù)據(jù)類型的賦值是在內(nèi)存中新開辟一段棧內(nèi)存,然后再把再將值賦值到新的棧中。結(jié)果見輸出,可以看出來,無論是修改賦值得到的對(duì)象和淺拷貝得到的都會(huì)改變?cè)紨?shù)據(jù)。
存儲(chǔ)問題:
深拷貝和淺拷貝的主要區(qū)別:在內(nèi)存中的存儲(chǔ)類型(堆和棧)不同
堆:動(dòng)態(tài)分配的內(nèi)存,大小不定也不會(huì)自動(dòng)釋放
棧:自動(dòng)分配的內(nèi)存,由系統(tǒng)自動(dòng)釋放
數(shù)據(jù)類型:
基本數(shù)據(jù)類型:
javascript的基本數(shù)據(jù)類型5種:undefined null number string boolean
存儲(chǔ)位置
棧。原因:數(shù)據(jù)大小確定,內(nèi)存空間大小可以分配,是直接按值存放的。
值是否可變?
基本數(shù)據(jù)類型值不可變,javascript中的原始值(undefined、null、布爾值、數(shù)字和字符串)與對(duì)象(包括數(shù)組和函數(shù))有著根本區(qū)別。原始值是不可更改的:任何方法都無法更改(或“突變”)一個(gè)原始值。對(duì) 數(shù)字和布爾值來說顯然如此 —— 改變數(shù)字的值本身就說不通,而對(duì)字符串來說就不那么明顯了,因?yàn)樽址雌饋硐裼勺址M成的數(shù)組,我們期望可以通過指定索引來假改字符串中的字符。實(shí)際上,javascript 是禁止這樣做的。字符串中所有的方法看上去返回了一個(gè)修改后的字符串,實(shí)際上返回的是一個(gè)新的字符串值。
基本類型的比較
基本類型的比較是值的比較,只要兩個(gè)變量的值相等就認(rèn)為他們是相等的。 比較最好用 === ,因?yàn)?== 會(huì)進(jìn)行類型轉(zhuǎn)換,例如:var a = 1; var b= true;if(a==b) 則會(huì)返回true
引用數(shù)據(jù)類型(object):
存儲(chǔ)位置
堆。變量實(shí)際上是存放在棧內(nèi)存中的一個(gè)指針,這個(gè)指針指向堆內(nèi)存中的地址,每個(gè)空間大小不一樣,要根據(jù)情況進(jìn)行特定的分配。
值是否可變?
引用類型值可變
var a = [1,2,3];
a[1] = 5;
console.log(a[1]); // 5
應(yīng)用類型的比較
引用類型的比較是引用的比較
所以每次我們對(duì) js 中的引用類型進(jìn)行操作的時(shí)候,都是操作其對(duì)象的引用(保存在棧內(nèi)存中的指針),所以比較兩個(gè)引用類型,是看其的引用是否指向同一個(gè)對(duì)象。
var a = [1,2,3];
var b = [1,2,3];
console.log(a === b); // false
雖然變量 a 和變量 b 都是表示一個(gè)內(nèi)容為 1,2,3 的數(shù)組,但是其在內(nèi)存中的位置不一樣,也就是說變量 a 和變量 b 指向的不是同一個(gè)對(duì)象,所以他們是不相等的。
傳值和傳址
基本數(shù)據(jù)類型賦值
基本數(shù)據(jù)類型的賦值(=)是在內(nèi)存中新開辟一段棧內(nèi)存,然后再把再將值賦值到新的棧中。 var a = 10; var b = a; a ++; console.log(a); // 11 console.log(b); // 10
引用數(shù)據(jù)類型賦值
但是引用類型的賦值是傳址。只是改變指針的指向,例如,也就是說引用類型的賦值是對(duì)象保存在棧中的地址的賦值,這樣的話兩個(gè)變量就指向同一個(gè)對(duì)象,因此兩者之間操作互相有影響。 var a = {}; // a保存了一個(gè)空對(duì)象的實(shí)例 var b = a; // a和b都指向了這個(gè)空對(duì)象 a.name = "jozo"; console.log(a.name); // "jozo" console.log(b.name); // "jozo" b.age = 22; console.log(b.age); // 22 console.log(a.age); // 22 console.log(a == b);// true
淺拷貝
那么賦值和淺拷貝有什么區(qū)別呢,我們看下面這個(gè)例子:
var obj1 = { "name" : "zhangsan", "age" : "18", "language" : [1,[2,3],[4,5]], }; var obj2 = obj1; var obj3 = shallowCopy(obj1); function shallowCopy(src) { var dst = {}; for (var prop in src) { if (src.hasOwnProperty(prop)) { dst[prop] = src[prop]; } } return dst; } obj2.name = "lisi"; obj3.age = "20"; obj2.language[1] = ["二","三"]; obj3.language[2] = ["四","五"]; console.log(obj1); //obj1 = { // "name" : "lisi", // "age" : "18", // "language" : [1,["二","三"],["四","五"]], //}; console.log(obj2); //obj2 = { // "name" : "lisi", // "age" : "18", // "language" : [1,["二","三"],["四","五"]], //}; console.log(obj3); //obj3 = { // "name" : "zhangsan", // "age" : "20", // "language" : [1,["二","三"],["四","五"]], //};
先定義個(gè)一個(gè)原始的對(duì)象 obj1,然后使用賦值得到第二個(gè)對(duì)象 obj2,然后通過淺拷貝,將 obj1 里面的屬性都賦值到 obj3 中。也就是說:
obj1:原始數(shù)據(jù)
obj2:賦值操作得到
obj3:淺拷貝得到
然后我們改變 obj2 的 name 屬性和 obj3 的 name 屬性,可以看到,改變賦值得到的對(duì)象 obj2 同時(shí)也會(huì)改變?cè)贾?obj1,而改變淺拷貝得到的的 obj3 則不會(huì)改變?cè)紝?duì)象 obj1。這就可以說明賦值得到的對(duì)象 obj2 只是將指針改變,其引用的仍然是同一個(gè)對(duì)象,而淺拷貝得到的的 obj3 則是重新創(chuàng)建了新對(duì)象。
然而,我們接下來來看一下改變引用類型會(huì)是什么情況呢,我又改變了賦值得到的對(duì)象 obj2 和淺拷貝得到的 obj3 中的 language 屬性的第二個(gè)值和第三個(gè)值(language 是一個(gè)數(shù)組,也就是引用類型)。結(jié)果見輸出,可以看出來,無論是修改賦值得到的對(duì)象 obj2 和淺拷貝得到的 obj3 都會(huì)改變?cè)紨?shù)據(jù)。
這是因?yàn)闇\拷貝只復(fù)制一層對(duì)象的屬性,并不包括對(duì)象里面的為引用類型的數(shù)據(jù)。所以就會(huì)出現(xiàn)改變淺拷貝得到的 obj3 中的引用類型時(shí),會(huì)使原始數(shù)據(jù)得到改變。
深拷貝:將 B 對(duì)象拷貝到 A 對(duì)象中,包括 B 里面的子對(duì)象,
淺拷貝:將 B 對(duì)象拷貝到 A 對(duì)象中,但不包括 B 里面的子對(duì)象
深拷貝
深拷貝是對(duì)對(duì)象以及對(duì)象的所有子對(duì)象進(jìn)行拷貝。
怎么進(jìn)行深拷貝?
思路就是遞歸調(diào)用剛剛的淺拷貝,把所有屬于對(duì)象的屬性類型都遍歷賦給另一個(gè)對(duì)象即可
zepto深拷貝的例子
還需要繼續(xù)了解深拷貝的實(shí)現(xiàn)方案。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/107090.html
摘要:開門見山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。高級(jí)屬性修改深拷貝滿足對(duì)象的復(fù)制,淺拷貝影響原數(shù)組。關(guān)于對(duì)象的深淺拷貝,暫且探索到這里,后續(xù)有新發(fā)現(xiàn)再進(jìn)行補(bǔ)充。 showImg(https://segmentfault.com/img/remote/1460000014305581); 開門見山,有人叫對(duì)象的復(fù)制為深復(fù)制淺復(fù)制,也有人叫深拷貝淺拷貝。其實(shí)都是copy。 ...
摘要:專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路前言拷貝也是面試經(jīng)典吶數(shù)組的淺拷貝如果是數(shù)組,我們可以利用數(shù)組的一些方法比如返回一個(gè)新數(shù)組的特性來實(shí)現(xiàn)拷貝。所以我們可以看出使用和是一種淺拷貝。 JavaScript 專題系列第六篇,講解深淺拷貝的技巧和以及實(shí)現(xiàn)深淺拷貝的思路 前言 拷貝也是面試經(jīng)典吶! 數(shù)組的淺拷貝 如果是數(shù)組,我們可以利用數(shù)組的一些方法比如:slice、co...
摘要:什么是深淺概念深拷貝淺拷貝只針對(duì)像這樣的對(duì)象,對(duì)于基本類型而言,可以理解為是沒有深淺的區(qū)別的。和指向了同一塊內(nèi)存深拷貝重新開辟了一個(gè)空間,修改對(duì)象的屬性,彼此不會(huì)影響。并不會(huì)更改使用遞歸適用于對(duì)象里面有對(duì)象 什么是深淺 概念 深拷貝、淺拷貝只針對(duì)像Object/Array這樣的對(duì)象,對(duì)于基本類型而言,可以理解為是沒有深淺的區(qū)別的。 淺拷貝復(fù)制的是引用,修改對(duì)象的屬性,會(huì)彼此影響。 ju...
摘要:為何寫最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。深拷貝如果給放到新的內(nèi)存中,將的各個(gè)屬性都復(fù)制到新內(nèi)存里,就是深拷貝。安全的值是指能夠呈現(xiàn)為有效格式的值。參考文檔冴羽的專題之深淺拷貝深拷貝與淺拷貝的實(shí)現(xiàn) 為何寫: 最近在研究深淺拷貝,找了很多資料,感覺不是很滿意,所以自己就整理了一份。廢話不多說,我們來一起復(fù)習(xí)一下吧,也希望留下您寶貴意見。 何為深淺拷貝?...
摘要:深復(fù)制實(shí)現(xiàn)代碼如下第一種方法通過遞歸解析解決第二種方法通過解析解決作者六師兄鏈接原生深拷貝的實(shí)現(xiàn)處理未輸入新對(duì)象的情況通過方法構(gòu)造新的對(duì)象 深淺拷貝針對(duì)的是 對(duì)象類型,如果是字符串的數(shù)組用[...arr],還是不會(huì)影響 要區(qū)分針對(duì)數(shù)組的深淺拷貝(默認(rèn)情況為里面沒有對(duì)象的數(shù)組),與針對(duì)對(duì)象的深淺拷貝 JavaScript數(shù)組深拷貝和淺拷貝的兩種方法 let a1 = [1, 2]; ...
摘要:基本數(shù)據(jù)類型的復(fù)制很簡(jiǎn)單,就是賦值操作,所以深淺拷貝也是針對(duì),這類引用類型數(shù)據(jù)。它會(huì)拋棄對(duì)象的。另外,查資料過程中還看到這么一個(gè)詞結(jié)構(gòu)化克隆算法還有這一篇資料也有參考,也寫得比較詳細(xì)了的深淺拷貝 基本數(shù)據(jù)類型的復(fù)制很簡(jiǎn)單,就是賦值操作,所以深淺拷貝也是針對(duì)Object,Array這類引用類型數(shù)據(jù)。 淺拷貝對(duì)于字符串來說,是值的復(fù)制,而對(duì)于對(duì)象來說則是對(duì)對(duì)象地址的復(fù)制;而深拷貝的話,它不...
閱讀 3274·2021-11-10 11:36
閱讀 3222·2021-11-02 14:39
閱讀 1821·2021-09-26 10:11
閱讀 5166·2021-09-22 15:57
閱讀 1763·2021-09-09 11:36
閱讀 2126·2019-08-30 12:56
閱讀 3556·2019-08-30 11:17
閱讀 1772·2019-08-29 17:17