涉及到幾個知識點(diǎn),分別是:堆棧寻定、基本數(shù)據(jù)類型儒洛、引用數(shù)據(jù)類型。
堆棧:兩者都是臨時存放數(shù)據(jù)的地方狼速。棧區(qū)(stack) 由編譯器自動分配釋放內(nèi)存 琅锻,后進(jìn)先出,存放函數(shù)的參數(shù)值向胡,局部變量的值等恼蓬。 堆區(qū)(heap) 一般由程序員動態(tài)分配釋放內(nèi)存,若程序員不釋放僵芹,程序結(jié)束時可能由OS回收处硬。?堆(數(shù)據(jù)結(jié)構(gòu)):堆可以被看成是一棵樹,如:堆排序拇派; 棧(數(shù)據(jù)結(jié)構(gòu)):一種先進(jìn)后出的數(shù)據(jù)結(jié)構(gòu)郁油。
基本數(shù)據(jù)類型:number,string,boolean,null,undefined五類,名值存儲在棧內(nèi)存中攀痊。
引用數(shù)據(jù)類型:(Object類)有常規(guī)名值對的無序?qū)ο髙a:1}桐腌,數(shù)組[1,2,3],以及函數(shù)等苟径。名存在棧內(nèi)存中案站,值存在于堆內(nèi)存中,但是棧內(nèi)存會提供一個引用的地址指向堆內(nèi)存中的值棘街。
認(rèn)識深拷貝和淺拷貝
javascript中一般有按值傳遞和按引用傳遞兩種復(fù)制蟆盐,按值傳遞的是基本數(shù)據(jù)類型(Number,String,Boolean,Null,Undefined),一般存放于內(nèi)存中的棧區(qū)遭殉,存取速度快石挂,存放量小险污;按引用傳遞的是引用類型(Object,Array,Function,Symbol)痹愚,一般存放與內(nèi)存中的堆區(qū),存取速度慢蛔糯,存放量大拯腮,其引用指針存于棧區(qū),并指向引用本身蚁飒。
深拷貝和淺拷貝是相對于引用類型而言的:
淺拷貝: 指兩個js 對象指向同一個內(nèi)存地址动壤,其中一個改變會影響另一個;
深拷貝: 指復(fù)制后的新對象重新指向一個新的內(nèi)存地址淮逻,兩個對象改變互不影響琼懊。
深拷貝的常用方式:
1阁簸,遞歸
2,JSON.parse(JSON.stringfiy(obj));
3哼丈,$.extend(true,{},obj)启妹;
4,lodash中的_.clone(obj, true)削祈;
5,_.cloneDeep(obj)?
參考文章:詳解javascript的深拷貝與淺拷貝