JavaScript 有七種內(nèi)置類(lèi)型,其中:
基本類(lèi)型
? 空值(null) ? 未定義(undefined) ? 布爾值( boolean) ? 數(shù)字(number) ? 字符串(string) ? 符號(hào)(symbol,ES6 中新增)
引用類(lèi)型
? 對(duì)象(object)
對(duì)于基本類(lèi)型,賦值(=)是值的拷貝,比較(===)的是實(shí)際的值,而對(duì)于引用類(lèi)型(Array也是一種Object),賦值(=)是引用地址的拷貝,比較(===)的是引用地址:
注:下面圖例中用類(lèi)似于X000001,X000002表示引用地址,只為了更好的舉例說(shuō)明,并不是真實(shí)的值
案例一const a = "哈哈" const b = "哈哈" console.log(a === b) // true const c = {} const d = {} console.log(c === d) // false
注解:
1.a和b是字符串,比較的是值,完全相等 2.c和d是對(duì)象,比較的是引用地址,c和d都是一個(gè)新對(duì)象,方別指向不同的地址,所以不相等案例二
let a = { z: 5, y: 9 } let b = a b.z = 6 delete b.y b.x = 8 console.log(a) // {z: 6, x: 8} console.log(a === b) // true
注解:
1.a是對(duì)象,b=a是將a的引用地址賦值給b 2.a和b都指向與同一個(gè)對(duì)象,修改這個(gè)對(duì)象,a和b都會(huì)變化案例三
let a = { z: 5 } let b = a b = {z: 6} console.log(a.z) // 5 console.log(a === b) // false
注解:
1.a是對(duì)象,b=a是將a的引用地址賦值給b 2.b = {z: 6}新對(duì)象賦值給b,切斷了a和b的聯(lián)系,分別指向于不同的對(duì)象總結(jié):(精髓所在)
只操作(修改,刪除,添加)對(duì)象的屬性,不會(huì)與之前對(duì)象斷開(kāi)連接(案例二)
直接操作對(duì)象本身,也就是最外層,會(huì)和之前的對(duì)象斷開(kāi)連接(案例三)
數(shù)組也是對(duì)象
案例四let a = { z: 5, y: {x: 8}, w: {r: 10} } let b = {...a} b.z = 6 b.y.x = 9 b.w = {r: 11} console.log(a) // { z: 5, y: {x: 9}, w: {r: 10}} console.log(a.y === b.y) // true console.log(a.w === b.w) // false console.log(a === b) // false
注解:
1.b = {...a}中,z是基本類(lèi)型直接拷貝值,y和w是對(duì)象,是引用地址的拷貝 2.y是只操作屬性,連接不會(huì)斷開(kāi),w操作了本身,生產(chǎn)了一個(gè)新對(duì)象,連接斷開(kāi)(參考上面的總結(jié))
案例四理解之后應(yīng)該就知道為什么js對(duì)象有淺拷貝和深拷貝的區(qū)分了
場(chǎng)景:目前有多個(gè)用戶,每個(gè)用戶有自己的屬性,展示并且可以修改
程序?qū)崿F(xiàn)(例如vue)
首先我們將每一個(gè)用戶都封裝成一個(gè)多帶帶的模塊(.vue),用戶初始數(shù)據(jù)存放在model里面(vuex)
一般來(lái)說(shuō)修改model里面數(shù)據(jù),都需要用它的mutations和actions里面的方式,如果用戶屬性比較多,每一項(xiàng)都需要去定義一個(gè)mutations或actions的話,那開(kāi)發(fā)量是相當(dāng)?shù)拇?/p>
利用對(duì)象的引用關(guān)系,傳過(guò)來(lái)的數(shù)據(jù)不和源對(duì)象,切斷關(guān)系,是直接可以操作源對(duì)象,組件與組件之間的通信也可以這個(gè)實(shí)現(xiàn)
有利也有弊,這種操作起來(lái)很簡(jiǎn)單,但一旦切斷他們的聯(lián)系之后,不好維護(hù),用這種方式需要對(duì)對(duì)象引用有深入的理解,知道什么時(shí)候會(huì)斷開(kāi)聯(lián)系
個(gè)人建議只在這種多個(gè)相同組件中使用。
附加福利判斷兩個(gè)對(duì)象值是否相等(只是純值,不管引用地址)
https://segmentfault.com/a/11...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94723.html
摘要:深拷貝相比于淺拷貝速度較慢并且花銷(xiāo)較大。所以在賦值完成后,在棧內(nèi)存就有兩個(gè)指針指向堆內(nèi)存同一個(gè)數(shù)據(jù)。結(jié)果如下擴(kuò)展運(yùn)算符只能對(duì)一層進(jìn)行深拷貝如果拷貝的層數(shù)超過(guò)了一層的話,那么就會(huì)進(jìn)行淺拷貝那么我們可以看到和展開(kāi)原算符對(duì)于深淺拷貝的結(jié)果是一樣。 JS中數(shù)據(jù)類(lèi)型 基本數(shù)據(jù)類(lèi)型: undefined、null、Boolean、Number、String和Symbol(ES6) 引用數(shù)據(jù)類(lèi)型:...
摘要:動(dòng)手實(shí)現(xiàn)深拷貝利遞歸來(lái)實(shí)現(xiàn)對(duì)對(duì)象或數(shù)組的深拷貝。遞歸思路對(duì)屬性中所有引用類(lèi)型的值進(jìn)行遍歷,直到是基本類(lèi)型值為止。深拷貝只對(duì)對(duì)象自有屬性進(jìn)行拷貝測(cè)試數(shù)據(jù)拷貝方式其實(shí)也是一種繼承的方式,當(dāng)然繼承還是有其他方法的感謝支持 深淺拷貝 基本類(lèi)型 & 引用類(lèi)型 ECMAScript中的數(shù)據(jù)類(lèi)型可分為兩種: 基本類(lèi)型:undefined,null,Boolean,String,Number,Symb...
摘要:有這樣一個(gè)熱門(mén)問(wèn)題其實(shí)這個(gè)問(wèn)題很好理解,關(guān)鍵要弄清下面兩個(gè)知識(shí)點(diǎn)引擎對(duì)賦值表達(dá)式的處理過(guò)程賦值運(yùn)算的右結(jié)合性一賦值表達(dá)式形如的表達(dá)式稱為賦值表達(dá)式。賦值表達(dá)式是右結(jié)合的。 有這樣一個(gè)熱門(mén)問(wèn)題: var a = {n: 1}; var b = a; a.x = a = {n: 2}; alert(a.x); // --> undefined alert(b.x); // --> {n: ...
摘要:所以說(shuō)在中,也并不是一切都是對(duì)象原始類(lèi)型值不可變?cè)碱?lèi)型的變量的值是不可變的,只能給變量賦予新的值??梢岳斫饣绢?lèi)型的變量的值,就是字面上寫(xiě)的數(shù)值。有四個(gè)變量圖調(diào)用是傳參,內(nèi)層的會(huì)屏蔽外層的。圖內(nèi)層的的值被改變成的值被改變?yōu)椤? showImg(https://segmentfault.com/img/bVbldfK); 1. demo 如果你對(duì)下面的代碼沒(méi)有任何疑問(wèn)就能自信的回答出輸出...
摘要:閉包引起的內(nèi)存泄漏總結(jié)從理論的角度將由于作用域鏈的特性中所有函數(shù)都是閉包但是從應(yīng)用的角度來(lái)說(shuō)只有當(dāng)函數(shù)以返回值返回或者當(dāng)函數(shù)以參數(shù)形式使用或者當(dāng)函數(shù)中自由變量在函數(shù)外被引用時(shí)才能成為明確意義上的閉包。 文章同步到github js的閉包概念幾乎是任何面試官都會(huì)問(wèn)的問(wèn)題,最近把閉包這塊的概念梳理了一下,記錄成以下文章。 什么是閉包 我先列出一些官方及經(jīng)典書(shū)籍等書(shū)中給出的概念,這些概念雖然...
閱讀 4846·2021-09-22 16:06
閱讀 2150·2021-09-22 15:22
閱讀 1492·2019-08-30 15:54
閱讀 2570·2019-08-30 15:44
閱讀 2405·2019-08-29 16:31
閱讀 2068·2019-08-29 16:26
閱讀 2397·2019-08-29 12:41
閱讀 806·2019-08-29 12:22