堆棧和垃圾回收

堆棧

堆(heap)和棧(stack)
堆: 為程序員動(dòng)態(tài)分配的內(nèi)存悲酷,大小不定也不會(huì)自動(dòng)釋放粟关,特點(diǎn)是先進(jìn)先出疮胖;
棧: 為自動(dòng)分配的空間,它由系統(tǒng)自動(dòng)釋放闷板,特點(diǎn)是后進(jìn)后出获列。

基本數(shù)據(jù)類型存放于棧內(nèi)存中,Undefined Null String Number Boolean蛔垢,它們是直接按值存放的击孩,可以直接訪問。

引用數(shù)據(jù)類型存放于堆內(nèi)存中鹏漆,變量只是保存的一個(gè)指針巩梢,該指針指向堆內(nèi)存中的地址创泄,當(dāng)訪問引用類型數(shù)據(jù)(Array、Object括蝠、Function等)時(shí)鞠抑,先從棧中獲得該對(duì)象的指針,再從堆中取出對(duì)象的數(shù)據(jù)忌警。

值傳遞和地址傳遞

var a = 10;
var b = a;
b = 20;
console.log(a,b);
//以上的代碼修改 b 的值并不會(huì)影響 a 的值

var a = [1,2,3,4];
var b = a;
var c = a[0];
console.log(b);
console.log(c);
b[0] = 9;
c = 10;
console.log(a);//[9,2,3,4]
//以上代碼可以看出 當(dāng)改變 b 中的數(shù)據(jù)時(shí)搁拙,a 中的數(shù)據(jù)也發(fā)生了變化;改變 c 的 數(shù)據(jù)時(shí)法绵,a 不會(huì)受影響
//a 是數(shù)組箕速,屬引用類型,當(dāng)將 a 賦值給 a 時(shí)朋譬,傳遞的是棧中的地址盐茎,而不是堆內(nèi)存中的對(duì)象。
//而 c 只是從 a 堆內(nèi)存中獲取的一個(gè)數(shù)據(jù)值徙赢,保存于棧中字柠。修改 c 時(shí),是在棧中直接修改

深拷貝與淺拷貝

在定義引用數(shù)據(jù)類型時(shí)狡赐,變量存放的只是一個(gè)地址窑业。當(dāng)使用對(duì)象拷貝,傳遞的也只是一個(gè)地址枕屉。因此在訪問拷貝對(duì)象屬性時(shí)常柄,會(huì)根據(jù)地址找到源對(duì)象指向的堆內(nèi)存中。

淺拷貝

淺拷貝.PNG
var obj1 = {
    name : "zhar",
    desc : ["北京"]
}
function copy(o1){
    var newObj = {};
    for(var key in o1){
        newObj[key] = o1[key];
    }
    return newObj;
}
// var obj2 = obj1;
var obj2 = copy(obj1);
obj2.name = "tom";
obj2.desc.push("昌平");
console.log(obj1);//{ name: 'zhar', desc: [ '北京', '昌平' ] }

深拷貝

深拷貝.PNG
var obj1 = {
    name : "zhar",
    desc : ["北京"]
}
function copy(obj,target){
    var newObj = target || {};
    console.log(obj)
    for(var key in obj){
    //判斷是不是引用數(shù)據(jù)類型搀庶,即是不是對(duì)象
        if(typeof obj[key] === "object"){
            newObj[key] = (obj[key].constructor===Array)?[]:{};
//第二次調(diào)用時(shí)拐纱,要傳入target即newObj[key]铜异,newObj[key]要重復(fù)使用
            copy(obj[key],newObj[key]);
        }else{
            newObj[key] = obj[key];
        }
    }
    return newObj;
}
var obj2 = copy(obj1);

深拷貝就是為了解決淺拷貝時(shí)數(shù)據(jù)互相影響而存在的

垃圾回收

Javascript 具有自動(dòng)垃圾回收機(jī)制哥倔,執(zhí)行環(huán)境會(huì)管理代碼執(zhí)行過程中使用的內(nèi)存。

使我們不必像 C 或 C++開發(fā)者那樣揍庄,手動(dòng)去管理內(nèi)存的釋放咆蒿。

自動(dòng)回收機(jī)制原理:

垃圾回收器按照固定的時(shí)間間隔找出不再繼續(xù)使用的變量,然后釋放其占用的內(nèi)存蚂子。

兩種策略:

  1. 標(biāo)記清除(現(xiàn)在瀏覽器都在使用)
    最常用的垃圾回收方式沃测。當(dāng)變量進(jìn)入環(huán)境時(shí),將變量標(biāo)記為"進(jìn)入環(huán)境"食茎;當(dāng)變量離開環(huán)境時(shí)蒂破,將其標(biāo)記為"離開環(huán)境"。
    到2008年别渔,各瀏覽器使用的清除策略都是標(biāo)記清除附迷,差別在于時(shí)間間隔不同
  2. 引用計(jì)數(shù)(已被棄用)
    引用計(jì)數(shù)是跟蹤每個(gè)值被引用的次數(shù)惧互;當(dāng)有一個(gè)變量被引用時(shí),則這個(gè)值的引用次數(shù)加1喇伯,當(dāng)取消一個(gè)引用時(shí)喊儡,次數(shù)減1。當(dāng)引用值變?yōu)? 時(shí)稻据,將由垃圾收集器回收
    引用計(jì)數(shù)方式有嚴(yán)重的問題艾猜,就是,當(dāng)變量相互引用時(shí)捻悯,如:
var obj1 = {}
var obj2 = {}
obj1.a = obj2;
obj2.b = obj1;

對(duì)于上面的代碼匆赃,存在相互引用,其引用計(jì)數(shù)永遠(yuǎn)為2秋度,就會(huì)導(dǎo)致對(duì)象永遠(yuǎn)不會(huì)被回收炸庞。

前端程序員最簡單粗暴的釋放內(nèi)存的方式:

obj = null;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荚斯,隨后出現(xiàn)的幾起案子埠居,更是在濱河造成了極大的恐慌,老刑警劉巖事期,帶你破解...
    沈念sama閱讀 212,599評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滥壕,死亡現(xiàn)場離奇詭異,居然都是意外死亡兽泣,警方通過查閱死者的電腦和手機(jī)绎橘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來唠倦,“玉大人称鳞,你說我怎么就攤上這事〕肀牵” “怎么了冈止?”我有些...
    開封第一講書人閱讀 158,084評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長候齿。 經(jīng)常有香客問我熙暴,道長,這世上最難降的妖魔是什么慌盯? 我笑而不...
    開封第一講書人閱讀 56,708評(píng)論 1 284
  • 正文 為了忘掉前任周霉,我火速辦了婚禮,結(jié)果婚禮上亚皂,老公的妹妹穿的比我還像新娘俱箱。我一直安慰自己,他們只是感情好灭必,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,813評(píng)論 6 386
  • 文/花漫 我一把揭開白布狞谱。 她就那樣靜靜地躺著巍膘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪芋簿。 梳的紋絲不亂的頭發(fā)上峡懈,一...
    開封第一講書人閱讀 50,021評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音与斤,去河邊找鬼肪康。 笑死,一個(gè)胖子當(dāng)著我的面吹牛撩穿,可吹牛的內(nèi)容都是我干的磷支。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼食寡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼雾狈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起抵皱,我...
    開封第一講書人閱讀 37,866評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤善榛,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后呻畸,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體移盆,經(jīng)...
    沈念sama閱讀 44,308評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,633評(píng)論 2 327
  • 正文 我和宋清朗相戀三年伤为,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咒循。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,768評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡绞愚,死狀恐怖叙甸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情位衩,我是刑警寧澤裆蒸,帶...
    沈念sama閱讀 34,461評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站蚂四,受9級(jí)特大地震影響光戈,放射性物質(zhì)發(fā)生泄漏哪痰。R本人自食惡果不足惜遂赠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,094評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晌杰。 院中可真熱鬧跷睦,春花似錦、人聲如沸肋演。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蜕乡,卻和暖如春奸绷,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背层玲。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評(píng)論 1 267
  • 我被黑心中介騙來泰國打工号醉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人辛块。 一個(gè)月前我還...
    沈念sama閱讀 46,571評(píng)論 2 362
  • 正文 我出身青樓畔派,卻偏偏與公主長得像,于是被迫代替她去往敵國和親润绵。 傳聞我的和親對(duì)象是個(gè)殘疾皇子线椰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,666評(píng)論 2 350

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