JavaScript中的堆與棧 固蚤、淺拷貝與深拷貝

1. 什么是堆棧

在計算機(jī)領(lǐng)域中娘汞,堆棧是兩種數(shù)據(jù)結(jié)構(gòu),它們只能在一端(稱為棧頂(top))對數(shù)據(jù)項進(jìn)行插入和刪除夕玩,因而按照后進(jìn)先出的原理運作你弦。

  • 棧 stack:由編譯器自動分配釋放,存放函數(shù)的參數(shù)值燎孟,局部變量的值等禽作。其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。
  • 堆 heap:一般由程序員分配釋放缤弦, 若程序員不釋放领迈,程序結(jié)束時可能由OS回收。注意它與數(shù)據(jù)結(jié)構(gòu)中的堆是兩回事碍沐,分配方式倒是類似于鏈表。

2. JavaScript中的基本類型和引用類型與堆棧的聯(lián)系

  1. 基本類型:Undefined衷蜓、Null累提、Boolean、Number 和 String磁浇,這5中基本數(shù)據(jù)類型可以直接訪問斋陪,他們是按照值進(jìn)行分配的,存放在棧(stack)內(nèi)存中的簡單數(shù)據(jù)段,數(shù)據(jù)大小確定无虚,內(nèi)存空間大小可以分配缔赠。
  2. 引用類型:即存放在堆(heap)內(nèi)存中的對象,變量實際保存的是一個指針友题,這個指針指向另一個位置嗤堰。

內(nèi)存

棧 stack 內(nèi)存 堆 heap 內(nèi)存
1
"hello"
true
null
undefined
object1 {name: 'tom', age: 23}
array1 [1,2,3]
varible 23

varible = object1.age 是引用,所以在堆中保存的是指針度宦,在棧中保存的引用數(shù)據(jù)

  1. 最新的基本類型和引用類型踢匣,以及之間的區(qū)別。

基本數(shù)據(jù)類型:按值訪問戈抄,可操作保存在變量中的實際的值离唬。基本類型值指的是簡單的數(shù)據(jù)段划鸽。

基本數(shù)據(jù)類型有這六種:undefined输莺、null、string裸诽、number模闲、boolean、symbol(es6)崭捍。

引用類型:當(dāng)復(fù)制保存著對象的某個變量時尸折,操作的是對象的引用,但在為對象添加屬性時殷蛇,操作的是實際的對象实夹。引用類型值指那些可能為多個值構(gòu)成的對象。

引用類型有這幾種:Object粒梦、Array亮航、RegExp、Date匀们、Function缴淋、特殊的基本包裝類型(String、Number泄朴、Boolean)以及單體內(nèi)置對象(Global重抖、Math)。

3. 什么是淺拷貝祖灰,深拷貝

  1. 基本類型:Undefined钟沛、Null、Boolean局扶、Number 和 String恨统,這5中基本數(shù)據(jù)類型的拷貝叁扫,是直接在棧(stack)中增加新數(shù)據(jù),拷貝前后互不相干畜埋,所以不存在淺拷貝和深拷貝
  2. 引用類型, 淺拷貝下莫绣,拷貝引用類型的屬性時,是拷貝引用的指針悠鞍,所以修改內(nèi)容會影響原始對象对室。深拷貝下,拷貝引用類型的屬性時狞玛,是拷貝內(nèi)容软驰,所以修改不影響原始對象。

4. 手寫淺拷貝心肪,深拷貝

淺拷貝一锭亏,for in

function copy(obj){
    var newObj = {};
    for(var key in obj){
        newObj[key] = obj[key];
    }
    return newObj;
}

淺拷貝二, Object.keys

function copy2(obj){
    var newObj = {};
    Object.keys(obj).forEach(key=>{
        newObj[key] = obj[key]
    })
    return newObj;
}

深拷貝一,最簡單硬鞍,但只支持符合JSON格式的

function deepCopy(obj) {
    return JSON.parse(JSON.stringify(obj));
}

深拷貝二慧瘤,(推薦)基本類型直接賦值,對象分三種情況固该,null, array锅减,object,函數(shù)方法直接賦值

 function deepCopy(obj){
    var o;
    switch(typeof obj){
    case 'undefined': break;
    case 'string'   : o = obj + '';break;
    case 'number'   : o = obj - 0;break;
    case 'boolean'  : o = obj;break;
    case 'object'   :
        if(obj === null){
            o = null;
        }else{
            if(obj instanceof Array){
                o = [];
                for(var i = 0, len = obj.length; i < len; i++){
                    o.push(deepCopy(obj[i]));
                }
            }else{
                o = {};
                for(var k in obj){
                    o[k] = deepCopy(obj[k]);
                }
            }
        }
        break;
    default:
        o = obj;break;
    }
    return o;
}

深拷貝三伐坏,缺點怔匣,只支持拷貝對象

    function deepCopy(obj, clone) {
      clone = clone || {}
      for (const key in obj) {
        if (obj.hasOwnProperty(key)) {
          if (typeof obj[key] === 'object') {
            clone[key] = Array.isArray(obj[key]) ? [] : {}
            deepCopy(obj[key], clone[key])
          } else {
            clone[key] = obj[key]
          }
        }
      }
      return clone
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市桦沉,隨后出現(xiàn)的幾起案子每瞒,更是在濱河造成了極大的恐慌,老刑警劉巖纯露,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件剿骨,死亡現(xiàn)場離奇詭異,居然都是意外死亡埠褪,警方通過查閱死者的電腦和手機(jī)浓利,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來钞速,“玉大人贷掖,你說我怎么就攤上這事∮窆ぃ” “怎么了羽资?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遵班。 經(jīng)常有香客問我屠升,道長,這世上最難降的妖魔是什么狭郑? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任腹暖,我火速辦了婚禮,結(jié)果婚禮上翰萨,老公的妹妹穿的比我還像新娘脏答。我一直安慰自己,他們只是感情好亩鬼,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布殖告。 她就那樣靜靜地躺著,像睡著了一般雳锋。 火紅的嫁衣襯著肌膚如雪黄绩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天玷过,我揣著相機(jī)與錄音爽丹,去河邊找鬼。 笑死辛蚊,一個胖子當(dāng)著我的面吹牛粤蝎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播袋马,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼初澎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了虑凛?” 一聲冷哼從身側(cè)響起碑宴,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卧檐,沒想到半個月后墓懂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡霉囚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年捕仔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盈罐。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡榜跌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盅粪,到底是詐尸還是另有隱情钓葫,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布票顾,位于F島的核電站础浮,受9級特大地震影響帆调,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜豆同,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一番刊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧影锈,春花似錦芹务、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至辆床,卻和暖如春佳晶,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背佛吓。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工宵晚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人维雇。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓淤刃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親吱型。 傳聞我的和親對象是個殘疾皇子逸贾,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

推薦閱讀更多精彩內(nèi)容

  • JavaScript中的淺拷貝與深拷貝 學(xué)了這么長時間的JavaScript想必大家對淺拷貝和深拷貝還不太熟悉吧铝侵,...
    雪妮爸爸閱讀 682評論 0 0
  • 值類型與引用類型 談淺拷貝與深拷貝之前,我們需要先理清一個概念触徐,即值類型與引用類型咪鲜。 什么是值類型與引用類型?這要...
    franose閱讀 616評論 1 8
  • 堆與棧是什么,與淺拷貝和深拷貝有什么聯(lián)系鸟雏? 在計算機(jī)領(lǐng)域享郊,堆棧是兩種數(shù)據(jù)結(jié)構(gòu),都是一種數(shù)據(jù)項按序排列的數(shù)據(jù)結(jié)構(gòu)孝鹊,只...
    地里有油閱讀 316評論 0 0
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對...
    cosWriter閱讀 11,092評論 1 32
  • 今天看到一句漂亮的話:怕什么真理無窮進(jìn)一寸有一寸的歡喜炊琉。這句話是出自胡適。由此對胡適更加生出一份敬佩又活。 以前的我對...
    露露Yao閱讀 314評論 1 1