js基本數(shù)據(jù)類型:
數(shù)字(number)醇坝、字符串(string)邑跪、布爾類型(boolean)、未定義(undefined)、空(null)画畅、Symbol(ES6,唯一值)
js引用數(shù)據(jù)類型:
數(shù)組(array)砸琅、對象(object)、函數(shù)(function)
堆轴踱、棧內(nèi)存以及垃圾回收機制
棧內(nèi)存:基本數(shù)據(jù)類型放在棧內(nèi)存中症脂,它由系統(tǒng)自動釋放,在全局作用域時頁面關(guān)閉時釋放淫僻、局部作用域時函數(shù)執(zhí)行完成時釋放诱篷。
棧內(nèi)存局部作用域下,特殊情況不銷毀:
(1)函數(shù)執(zhí)行返回一個引用類型的值,且在別的作用域被接收了,該棧內(nèi)存不會被銷毀
(2)私有作用域中,給DOM元素的事件綁定方法,該棧內(nèi)存不會被銷毀
堆內(nèi)存:引用數(shù)據(jù)類型聲明的變量雳灵、以及指向堆內(nèi)存的指針存放在棧內(nèi)存中棕所,對象、函數(shù)存放到堆內(nèi)存中细办。通過變量的指針指向堆內(nèi)存的對象所以叫引用類型橙凳。
變量被聲明、引用時無法銷毀笑撞,可以通過賦值空對象指針null岛啸,瀏覽器在空閑時間,實現(xiàn)堆內(nèi)存的銷毀或回收(垃圾回收機制)茴肥。
垃圾回收機制:
1坚踩、標記清除
這是javascript中最常用的垃圾回收方式。當變量進入執(zhí)行環(huán)境是瓤狐,就標記這個變量為“進入環(huán)境”瞬铸。從邏輯上講,永遠不能釋放進入環(huán)境的變量所占用的內(nèi)存础锐,因為只要執(zhí)行流進入相應(yīng)的環(huán)境嗓节,就可能會用到他們。當變量離開環(huán)境時皆警,則將其標記為“離開環(huán)境”拦宣。
垃圾收集器在運行的時候會給存儲在內(nèi)存中的所有變量都加上標記。然后信姓,它會去掉環(huán)境中的變量以及被環(huán)境中的變量引用的標記鸵隧。而在此之后再被加上標記的變量將被視為準備刪除的變量,原因是環(huán)境中的變量已經(jīng)無法訪問到這些變量了意推。最后豆瘫。垃圾收集器完成內(nèi)存清除工作,銷毀那些帶標記的值菊值,并回收他們所占用的內(nèi)存空間外驱。
2育灸、引用計數(shù)
另一種不太常見的垃圾回收策略是引用計數(shù)。引用計數(shù)的含義是跟蹤記錄每個值被引用的次數(shù)昵宇。當聲明了一個變量并將一個引用類型賦值給該變量時描扯,則這個值的引用次數(shù)就是1。相反趟薄,如果包含對這個值引用的變量又取得了另外一個值绽诚,則這個值的引用次數(shù)就減1。當這個引用次數(shù)變成0時杭煎,則說明沒有辦法再訪問這個值了恩够,因而就可以將其所占的內(nèi)存空間給收回來。這樣羡铲,垃圾收集器下次再運行時蜂桶,它就會釋放那些引用次數(shù)為0的值所占的內(nèi)存。
深拷貝也切、淺拷貝:
什么是拷貝扑媚,我的理解就是賦值,只有引用類型才會涉及到深拷貝雷恃、淺拷貝疆股。
淺拷貝的理解:
就是A對象指針指向了一個堆內(nèi)存,A對象賦值給B后(淺拷貝)倒槐,B的指針也指向了同一個堆內(nèi)存(不創(chuàng)建新的堆內(nèi)存)旬痹,這樣只要改變A的堆內(nèi)存,A對象讨越、B對象都會改變两残。
淺拷貝就是賦值引用地址/指針。
深拷貝的理解:
A對象指針指向一個堆內(nèi)存把跨,A對象賦值給B后(深拷貝)人弓,B的指針也指向了新建的堆內(nèi)存(創(chuàng)建新的堆內(nèi)存),A的堆內(nèi)存改變着逐、B的不會跟著改變崔赌。
深拷貝就是在堆中創(chuàng)建一個與A一樣的堆內(nèi)存,B指向它滨嘱。